cha*_*ppy 19 python naming-conventions
PEP 8建议使用单个尾部下划线以避免与python关键字冲突,但是与标准python模块的模块名称冲突怎么办?这也应该是一个尾随下划线吗?
我想象的是这样的:
import time
time_ = time.time()
Run Code Online (Sandbox Code Playgroud)
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!
Run Code Online (Sandbox Code Playgroud)
这里的答案显然是重命名变量start
或t0
或别的东西.除了解决问题,它也是一个更有意义的名称.
但这仍然是1%.
例如,有些库可以生成Python代码,例如协议规范或.NET或ObjC接口,其名称不在您的控制之下; 您所能做的就是对翻译的名称应用某种程序化和明确的规则.在这种情况下,我认为附加_
到stdlib模块名称以及关键字的规则可能是个好主意.
您可以想出其他示例,其中变量不能被任意重命名,并且必须(至少可能)与time
模块位于相同的范围内,依此类推.在任何这种情况下,我都会选择_
后缀.