我正在为约30名开发人员的团队编写一组python编码指南。作为我的文档的基础,到目前为止,我已经研究了Google python style guide和PEP 8 style guide,并将两者都包含在内。
Google风格指南比PEP 8更具限制性的地方是导入。 Google指南要求开发人员仅导入包和模块,然后通过更合格的名称引用其中的项目。例如:
from pkg import module
...
my_class = module.MyClass()
理由是“每个标识符的来源以一致的方式表示”。对于我们的项目,我们打算使用两个或三个级别的包进行组织,因此要了解标识符的完整来源,读者可能还需要检查import语句。我想提倡这种导入方式作为“首选风格”:
from pkg.module import MyClass
...
my_class = MyClass()
恕我直言,当名字更简洁时,列表推导等python结构中的可读性得到了提升。
我不清楚的是python解释器可能在幕后做什么。例如,MyClass现在是该模块的全局命名空间的一部分,还是该模块的所有导入器? (这会很糟糕,可能会导致一些奇怪的错误;如果这是真的,我会提倡谷歌风格。)
我的python开发经验仅限于6个月(我们的项目专家咨询的人数不多),所以我想从社区获取更多信息。以下是我已经研究过的一些项目:
effbot - discussion on imports
stack overflow - import vs. from import
python documentation - modules
感谢您的回复!
答案 0 :(得分:5)
在Python中,没有一个变量在多个模块中是全局的。如果执行from pkg.module import MyClass
,则MyClass
位于模块的全局命名空间中,而不是任何其他模块(包括导入导入MyClass的模块的模块)。
至于更一般的问题,根据具体情况,任何一种进口机制都可以接受。如果模块名称很长,可以通过以不同的名称导入它来缩短:
# Awkward
from package import reallylongmodule
reallylongmodule.MyClass()
# Less awkward
from package import reallylongmodule as rlm
rlm.MyClass()
如果类名称足够独特,您可以告诉它来自哪里以及它是什么,那么只导入该类就可以了。但是,如果您有多个模块定义具有相对不同名称的类(例如,“处理器”,“单元”,“数据”,“管理器”),那么通过模块名称访问它们以澄清是个好主意你正在做什么。
风格指南最终是指南而非法律。我自己的偏好是选择一种最大化清晰度和可读性的机制。这需要在避免冗长和繁琐的名称之间进行权衡,同时避免使用简短,模糊或含糊的名称。如何进行权衡取决于您使用的特定库以及您如何使用它们(例如,您导入的模块数量,从中导入的数量)。
答案 1 :(得分:0)
我建议您使用自动代码检查程序,如pylint,pep8,pyflakes,而不是编写代码指南。
我个人更喜欢使用from pkg import module
,因为可能存在名称冲突。
from package import module
def my_fun():
module.function()
Inpreter必须执行3个哈希表查找本地函数名称空间,当前模块的全局名称空间和导入模块的名称空间。 在
from package.module import function
def my_fun():
function()
它只会执行2次查找:最后一次在导入时执行。