为什么id在Python中命名变量很不好?
ID。
为什么id在Python中命名变量很不好?
ID。
Answers:
id() 是基本的内置功能:
帮助
id模块中的 内置功能__builtin__:id(...) id(object) -> integer Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint: it's the object's memory address.)
通常,即使允许使用使用任何语言使关键字或内置函数都黯然失色的变量名也是一个坏主意。
id原定一次被移除,但最终他们决定不移除它。我不再能够编辑我的原始评论,因此将其删除以避免将来引起人们的混淆。
str = 'an example word:cat!!'。在任何PEP中是否有任何内容表明不执行此操作?
id是一个内置函数,用于提供对象的标识(这也是CPython中的内存地址)。如果命名函数之一id,则必须说出builtins.id要获取的原始函数(或__builtins__.id在CPython中)。id全局重命名除了一个小脚本之外,其他任何地方都令人困惑。
但是,只要使用本地名称,将内置名称重用作为变量并没有什么坏处。Python具有许多内置函数,这些函数(1)具有通用名称,(2)无论如何都不会使用太多。可以将它们用作局部变量或作为对象的成员,因为从上下文可以明显看出您正在做什么:
例:
def numbered(filename):
with open(filename) as file:
for i, input in enumerate(file):
print("%s:\t%s" % (i, input), end='')
一些带有诱人名称的内置函数:
idfilelist, dictmapall, anycomplex, intdirinputslicebuffersummin, maxobjectid返回对象内存地址的函数是CPython实现的细节。还值得注意的是,该函数仅需要为任意两个现存对象返回不同的数字。如果对象是垃圾回收,则其ID可能会被回收。
我可能会在这里说一些不受欢迎的东西:这id()是一个相当专业的内置函数,很少在业务逻辑中使用。因此,在紧密且编写良好的函数中将其用作变量名时,我看不出有任何问题,在这种情况下,显然id并不意味着内置函数。
import this
id无论如何,很少有人使用内置函数。就是说,当我的同事list用局部变量覆盖了内置变量时,我花了一段时间。因此,其他人提到的一般规则仍然有意义。
用内置函数命名任何变量都是不好的。原因之一是因为它会使不知道该名称被覆盖的读者感到困惑。
id是Python中的内置函数。分配一个值id将覆盖该功能。最好在中添加前缀,some_id或在中使用不同的大小写形式ID。
内置函数采用单个参数,并为您传递的对象(在CPython中)的内存地址返回一个整数。
>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760
其他人提到它令人困惑,但是我想进一步解释一下为什么。这是一个基于真实故事的示例。基本上,我编写了一个带有id参数的类,但是稍后尝试使用内置函数id。
class Employee:
def __init__(self, name, id):
"""Create employee, with their name and badge id."""
self.name = name
self.id = id
# ... lots more code, making you forget about the parameter names
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
tay = Employee('Taylor Swift', 1985)
预期产量:
Created Employee 'Taylor Swift' at 0x7efde30ae910
实际输出:
Traceback (most recent call last):
File "company.py", line 9, in <module>
tay = Employee('Taylor Swift', 1985)
File "company.py", line 7, in __init__
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
TypeError: 'int' object is not callable
??我要在哪里叫int?这些都是内置的...
如果我将其命名为badge_idor id_,那么我就不会遇到这个问题。