使用内置函数名作为属性或方法标识符是不好的实践吗?

54

我知道不要将内置函数名称用作变量标识符。

但是,是否有任何理由不使用它们作为属性或方法标识符?

例如,编写my_object.id = 5或在自己的类中定义实例方法dict是否安全?


2
相关:'id'是Python中不好的变量名 - Piotr Dobrogost
4个回答

44

这不会让解释器困惑,但可能会让阅读您代码的人感到困惑。应避免不必要地使用内置的属性和方法名称。

另一个不良影响是,覆盖内置名称会使大多数支持Python的编辑器(vi,emacs,pydev,idle等)的语法突出显示功能失效。此外,一些Lint工具也会警告这种做法。


21

是的,这是不好的编程习惯。尽管这不会立即对您造成任何影响,但它仍会损害代码的可读性。

引用PEP20中的一句话:

美观胜于丑陋。
简洁胜于复杂。
可读性很重要。
如果实现难以解释,那么这是一个坏主意。

看到调用myobject.dict(),自然会假设它将返回myobject.__dict__,或者myobject.id()返回与id(myobject)相同的东西。

他们可能会发现自己错了;但这需要时间和努力,可能会在他们弄清楚之前导致一些错误。把你的属性命名为myobject.object_id_number虽然更长,但可以更清楚地表明它与id(myobject)是不同的。


12

不,没关系。因为需要一个对象引用,所以无法让它们遮蔽内置的对象。


1
所以,我可以使用任何有效的标识符作为属性名称,除了以__开头或与关键字相同的标识符? - max
1
@max:[Python语言参考,第3节,“数据模型”](http://docs.python.org/reference/datamodel.html) - Ignacio Vazquez-Abrams
6
完全不应以__开头。如果这是一个私有属性,__foo被压缩也无伤大雅。__foo__表示它是Python内部使用的。在这样做方面没有问题,但这是不好的形式。 - Lennart Regebro
2
取决于你所说的“好”。代码仍然能运行吗?当然可以。使用内置名称是一种不良实践,可能会导致混淆吗?是的,这应该足以让任何人避免使用内置类型/函数作为变量名的原因。 - icdevppl
1
@icdevppl:即使作为属性名称,就像问题所问的那样? - Ignacio Vazquez-Abrams
显示剩余4条评论

0

当输入变量模仿Python内置函数时,我在函数上来回思考很多次。例如,单词 bytes 是一个Python内置函数,但考虑一个解析字节的实用程序库:

def parse_bytes(bytes):
    pass

我认为这种写法很容易阅读,但是 Pep8 Linter 不喜欢它。相反,我可以这样做:
def parse_bytes(bytearray):
    pass

def parse_bytes(somebytes):
    pass

或者使用类型提示

def parse_bytes(b: bytes):
    pass

但是所有这些都似乎更糟。如果你的变量名是input,同样的事情会发生...
最后我通常选择somebytes。

1
为什么不使用bytes_? - machinekoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接