是否有避免与标准的模块名称冲突巨蟒命名约定?(Is there a python naming co

2019-08-31 12:57发布

PEP 8建议使用一个单一的结尾下划线,以避免与蟒蛇约关键词与标准的模块模块名称冲突矛盾,但什么? 应该说也是一个结尾下划线?

我想象这样的事情:

import time
time_ = time.time()

Answer 1:

PEP 8似乎没有直接解决这个问题。

尾随下划线显然是必要的 ,当你有一个关键词碰撞,因为你的代码,否则养SyntaxError (或者,如果你真的不走运,编译意味着完全不同的东西比你意)。

所以,即使在你要命名类属性,实例属性,功能参数,或局部变量的上下文class ,你有去class_代替。

但同样是不正确的time 。 我认为在这种情况下,你不应该对postfix的下划线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模块,等等。 在任何这样的情况下,我会去的_后缀。



文章来源: Is there a python naming convention for avoiding conflicts with standard module names?