Python 最佳实践:如何给模块起别名

Python best practice: how to alias a module

我正在使用一个包含子模块 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

Hiding the imported module _pkg_mod_abbrev is useful, more so for cases where the name of the module would coincide with a name that is convenient to be used for variables (also this PEP 8 section).

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

import dd.bdd as _bdd


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


if __name__ == '__main__':
    _main()

通过 PEP 8, imported names are an implementation detail。因此,即使未隐藏,它们也不是模块 API.

的一部分