PEP 8建议使用单个下划线以避免与Python关键字冲突,但是对于标准Python模块的模块名称冲突呢?是否也应该使用单个下划线?
我想象中的情况是这样的:
import time
time_ = time.time()
PEP 8建议使用单个下划线以避免与Python关键字冲突,但是对于标准Python模块的模块名称冲突呢?是否也应该使用单个下划线?
我想象中的情况是这样的:
import time
time_ = time.time()
PEP 8似乎没有直接涉及这个问题。
当你的代码与一个关键字冲突时,结尾的下划线显然是必要的,因为否则你的代码会引发一个SyntaxError(或者如果你运气不好,编译成完全不同于你所期望的东西)。
因此,即使在你有一个类属性、实例属性、函数参数或本地变量想要命名为class
的情况下,你也必须使用class_
。
但是对于time
来说并非如此。我认为在这些情况下,你不应该为time
添加后缀下划线。
有先例——标准库中的多个类都有名为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
或其他有意义的名称,这样不仅可以解决问题,还能使名称更有意义。_
作为规则可能是一个好主意。time
模块处于相同的作用域等等。在任何这样的情况下,我会选择使用_
后缀。time_
。但我怀疑你在编码的整个生命周期中永远不会遇到这种情况。 - abarnerttime_
这个例子中,使用了单个尾随下划线。
single_trailing_underscore_
:按照惯例用于避免与Python关键字冲突,例如:
tkinter.Toplevel(master, class_='ClassName')
_file
和_id
局部变量重命名为file_
和id_
。 - ArtOfWarfare