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

cha*_*ppy 19 python naming-conventions

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

我想象的是这样的:

import time
time_ = time.time()
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 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!
Run Code Online (Sandbox Code Playgroud)

这里的答案显然是重命名变量startt0或别的东西.除了解决问题,它也是一个更有意义的名称.


但这仍然是1%.

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

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