PEP 8建议使用单个尾部下划线以避免与python关键字冲突,但是与标准python模块的模块名称冲突怎么办?这应该是一个尾随下划线吗?
我正在想象这样的事情:import time
time_ = time.time()
答案 0 :(得分:9)
PEP 8似乎没有直接解决它。
当您与关键字发生冲突时,尾随下划线显然是必要,因为否则您的代码会引发SyntaxError
(或者,如果您真的不走运,则编译为均值与你想要的完全不同的东西。)
因此,即使在您想要命名为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%。
例如,有些库可以生成Python代码,例如协议规范或.NET或ObjC接口,其名称不在您的控制之下;您所能做的就是对翻译的名称应用某种程序化和明确的规则。在这种情况下,我认为将_
附加到stdlib模块名称以及关键字的规则可能是个好主意。
您可以想出其他示例,其中变量不能只是被任意重命名,并且必须(至少可能)与time
模块位于同一范围内,依此类推。在任何此类情况下,我都会使用_
后缀。