是否有一个python命名约定,以避免与标准模块名称冲突?

时间:2013-04-19 00:16:27

标签: python naming-conventions

PEP 8建议使用单个尾部下划线以避免与python关键字冲突,但是与标准python模块的模块名称冲突怎么办?这应该是一个尾随下划线吗?

我正在想象这样的事情:

import time
time_ = time.time()

1 个答案:

答案 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!

这里显而易见的答案是重命名变量startt0或其他内容。除了解决这个问题,它也是一个更有意义的名字。


但这仍然是1%。

例如,有些库可以生成Python代码,例如协议规范或.NET或ObjC接口,其名称不在您的控制之下;您所能做的就是对翻译的名称应用某种程序化和明确的规则。在这种情况下,我认为将_附加到stdlib模块名称以及关键字的规则可能是个好主意。

您可以想出其他示例,其中变量不能只是被任意重命名,并且必须(至少可能)与time模块位于同一范围内,依此类推。在任何此类情况下,我都会使用_后缀。