6

我正在为大约 30 名开发人员的团队编写一组 Python 编码指南。作为我的文档的基础,到目前为止,我已经研究了Google python style guidePEP 8 style guide,并结合了两者的信息。

Google 风格指南比 PEP 8 更严格的地方之一是导入。Google 指南要求开发人员仅导入包和模块,然后通过更合格的名称引用其中的项目。例如:

from pkg import module
...
my_class = module.MyClass()

理由是“每个标识符的来源都以一致的方式指示”。对于我们的项目,我们打算用两到三层深度的包来组织,所以要知道标识符的完整来源,读者可能无论如何都需要检查导入语句。我想提倡这种导入风格作为“首选风格”:

from pkg.module import MyClass
...
my_class = MyClass()

恕我直言,当名称更简洁时,python 结构(如列表推导)的可读性会得到提高。

我不清楚的是 python 解释器可能在幕后做什么。例如,MyClass 现在是这个模块和这个模块的所有导入器的全局命名空间的一部分吗?(这会很糟糕,可能会导致一些奇怪的错误;如果这是真的,我会提倡 Google 风格)。

我的python开发经验被限制在6个月左右(而且我们项目上没有太多专家可以咨询),所以我想从社区获得更多信息。以下是我已经研究过的一些项目:

effbot - 关于进口的讨论

堆栈溢出 - 导入与从导入

python 文档 - 模块

python 文档 - 导入

谢谢您的反馈!

4

2 回答 2

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()

如果类名足够独特,你可以知道它来自哪里以及它是什么,那么只导入类就可以了。但是,如果您有多个模块定义了具有相对难以描述的名称的类(例如,“处理器”、“单元”、“数据”、“管理器”),那么最好通过模块名称访问它们以澄清你在做什么。

风格指南最终是指南,而不是法律。我自己的偏好是选择一种能够最大限度地提高清晰度和可读性的机制。这涉及在避免冗长和繁琐的名称与避免简短、模糊或神秘的名称之间进行权衡。您如何进行权衡取决于您正在使用的特定库以及您如何使用它们(例如,您导入了多少模块,从它们导入了多少东西)。

于 2013-04-10T22:22:09.653 回答
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 次查找:最后一次是在导入时执行的。

于 2013-04-10T22:29:00.897 回答