我正在使用一个包
pkg
,它有一个子模块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
您知道关于这个问题的任何参考吗?
我建议始终使用以下表格:
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
将在中定义 module_name
使用 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 的一部分。