Python 最佳实践:如何为模块添加别名



我正在使用具有子模块module_with_long_name的包pkg。这个模块是由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

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

我建议始终使用以下形式:

import package_name.subpackage_name.module_name as pkg_mod_abbrev

其中pkg_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......import将使用as在没有混叠的情况下定义module_name)。

隐藏导入的模块_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 的一部分。

最新更新