PEP 8建议使用单个尾随下划线以避免与 python 关键字冲突,但是与标准 python 模块的模块名称冲突怎么办?这也应该是一个单一的尾随下划线吗?
我在想象这样的事情:
import time
time_ = time.time()
PEP 8建议使用单个尾随下划线以避免与 python 关键字冲突,但是与标准 python 模块的模块名称冲突怎么办?这也应该是一个单一的尾随下划线吗?
我在想象这样的事情:
import time
time_ = time.time()
PEP 8 似乎没有直接解决它。
当您与关键字冲突时,结尾的下划线显然是必要SyntaxError
的,因为否则您的代码会引发 a (或者,如果您真的很不幸,编译为与您预期的完全不同的东西)。
因此,即使在您有要命名的类属性、实例属性、函数参数或局部变量的上下文中,class
您也必须使用它class_
。
但对于time
. 而且我认为在这些情况下,您不应该为time
.
这是有先例的——stdlib 本身中的多个类具有命名的方法或数据属性time
(它们都没有time_
)。
当然,在某些情况下,您要在与模块相同的范围内创建名称(通常意味着全局变量或函数)。然后你就有更多的混乱可能性,并且隐藏了time
在当前范围的其余部分访问模块上任何内容的能力。
我认为 90% 的时间,答案将是“这不应该是全球性的”。
但这仍然留下了另外 10%。
还有一种情况是您的名字位于受限制的命名空间中,但该命名空间是您需要访问time
模块的函数内部的本地范围。
或者,也许,在一个长而复杂的函数中(你不应该有任何,但是......有时你会这样做)。如果对于本地而不是模块的人类读者来说不是很明显time
,那与混淆解释器一样糟糕。
在这里,我认为剩下的 99% 的时间,答案是“随便取个名字”。
例如,看看这段代码:
def dostuff(iterable):
time = time.time()
for thing in iterable:
dothing(thing)
return time.time() - time # oops!
这里明显的答案是重命名变量start
或t0
其他东西。除了解决问题,它也是一个更有意义的名字。
但这仍然留下了 1%。
例如,有些库会根据协议规范或 .NET 或 ObjC 接口生成 Python 代码,其中的名称不受您的控制;您所能做的就是对翻译后的名称应用某种程序化且明确的规则。在这种情况下,我认为附加_
到 stdlib 模块名称和关键字的规则可能是一个好主意。
您可能会想出其他示例,其中变量不能随意重命名,并且必须(至少可能)与time
模块位于相同的范围内,等等。在任何这种情况下,我都会选择_
后缀。