首页 > 解决方案 > Python 最佳实践:如何给模块起别名

问题描述

我正在使用一个包含pkgsubmodule的包module_with_long_name。这个模块是由 导入的pkg,所以我可以module_with_long_name在不显式导入的情况下使用它:

import pkg
pkg.do_stuff()
pkg.module_with_long_name.do_other_stuff()

但是我想给这个模块起别名,因为它的名称很长,而且我找不到任何 PEP 约定来说明以下两个中的哪一个是最佳实践:

import pkg
# First way
from pkg import module_with_long_name as module
# Second way
module = pkg.module_with_long_name

你知道关于这个问题的任何参考吗?

标签: pythonpython-importpep

解决方案


我建议始终使用以下表格:

import package_name.subpackage_name.module_name as pkg_mod_abbrev

wherepkg_mod_abbrev是适用于当前模块的缩写。这种方法:

  • 以相同的方式对齐所有import语句,与它们是否重命名导入的项无关(即它们是否包含关键字as)。这提高了可读性。

  • 保持导入路径连续。这更具可读性。写入from package_name.subpackage_name import module_name as pkg_mod_abbrev将模块名称与导入路径的另一部分分开。这需要跳过在import导入路径的第一部分和模块名称之间出现的关键字。阅读这将需要更多时间。

  • 鼓励:

    • 使用模块内的完整导入路径(即,package_name.subpackage_name.module_name),或
    • 创建一个适合当前模块的缩写(即pkg_mod_abbrev

    从而避免使用module_name(写作import package_name.subpackage_name.module_name as module_name仍然是可能的,但编写as重命名本身可能会提示选择合适的缩写;而from...importmodule_name在没有别名的情况下定义 using as)。

隐藏导入的模块_pkg_mod_abbrev很有用,尤其是在模块名称与便于用于变量的名称一致的情况下(也是此 PEP 8 部分)。

例如,bdd缩写为“二元决策图”。该包dd有一个名为bdd. bdd命名作为类实例的 Python 变量很方便dd.bdd.BDD。尽管如此,将模块命名为“bdd”也很方便dd.bdd。隐藏导入的模块可以同时启用,这也改善了内省:

import dd.bdd as _bdd


def _main():
    bdd = _bdd.BDD()


if __name__ == '__main__':
    _main()

通过PEP 8,导入的名称是实现细节。因此,即使未隐藏,它们也不是模块 API 的一部分。


推荐阅读