22

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

我在想象这样的事情:

import time
time_ = time.time()
4

1 回答 1

12

PEP 8 似乎没有直接解决它。

当您与关键字冲突时,结尾的下划线显然是必要SyntaxError的,因为否则您的代码会引发 a (或者,如果您真的很不幸,编译为与您预期的完全不同的东西)。

因此,即使在您有要命名的类属性、实例属性、函数参数或局部变量的上下文中,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%。

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

您可能会想出其他示例,其中变量不能随意重命名,并且必须(至少可能)与time模块位于相同的范围内,等等。在任何这种情况下,我都会选择_后缀。

于 2013-04-19T00:24:30.747 回答