我正在使用具有子模块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 的一部分。