繁体   English   中英

谷歌 Python 风格指南和相关进口

[英]Google Python Style Guide & relative imports

谷歌 Python 风格指南

不要在导入中使用相对名称。 即使模块在同一个 package 中,也要使用完整的 package 名称。 这有助于防止意外导入 package 两次。

导致导入 package 两次的示例设置是什么?

这是对隐式相对导入的 Python 2 行为(自 2.6 起已弃用)的引用:允许 package foo中的模块中的import bar引用模块foo.bar 考虑sys.path上的一个目录,看起来像

…
|-- client.py
`-- pkg
    |-- __init__.py
    |-- mod.py
    `-- script.py

具有以下内容的文件:

client.py

print "client..."
from pkg import mod,script
print "client!"

pkg/__init__.py

print "pkg"

pkg/mod.py

print "mod: %r"%__name__

pkg/script.py

print "script:",__name__,__package__

if __name__=='__main__':
  import mod,client
  print "script!"

在此设置mod ,可以轻松导入两次:

$ PYTHONPATH=… python …/pkg/script.py
script: __main__ None
mod: 'mod'
client...
pkg
mod: 'pkg.mod'
script: pkg.script None
client!
script!

为了减少配置开销,Python 将目录pkg添加到sys.path ,有效地假定script.py是顶级模块script 不幸的是,这意味着import mod创建了一个名为mod顶级模块,并且pkg.mod的显式导入稍后会导致它的另一个副本以其全名存在(就在导入pkg本身之后)。

认识到这会带来问题,后来调整-m以告诉正在执行的模块关于 package 的发现,以便相对导入(隐式或显式)正常工作:

$ PYTHONPATH=… python -m pkg.script
pkg
script: __main__ pkg
mod: 'pkg.mod'
client...
script: pkg.script None
client!
script!

请注意,现在首先导入pkg (通过-m本身),该script现在立即具有__package__属性,并且该mod只导入一次。 当然, script本身(仍然)被加载了两次,因为它的名称第一次被替换为__main__以便from pkg import script以不同的名称找到它。

寓意是,按照__name__=='__main__'实现“模块也可以是脚本”从根本上被破坏(并且替换已被拒绝):模块已经一个__name__ ,并创建一个单独的模块 object 作为入口点使其__name__可以不同,这与复制提供main的 Java class (及其所有 static 数据)一样荒谬。 制作一个没有人导入的模块是可行的,但却是矛盾的(并且会破坏导入包所有成员的代码检查)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM