是否有python命名约定以避免与标准模块名称冲突?
问题内容:
PEP 8建议使用单个结尾的下划线来避免与python关键字冲突,但是与标准python模块的模块名称冲突呢?那还应该是一个下划线吗?
我在想像这样的事情:
import time
time_ = time.time()
问题答案:
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%。
例如,有些库是根据协议规范,.NET或ObjC接口生成Python代码的,而这些名称不在您的控制之下。您所能做的就是将某种程序化且明确的规则应用于翻译后的名称。在那种情况下,我认为_
在stdlib模块名称和关键字后附加一条规则可能是个好主意。
您可能会想出其他示例,其中的变量不能只是被随意重命名,并且必须(至少可能)与time
模块处于相同的作用域,依此类推。在任何这种情况下,我都会选择_
后缀。