'id'是Python中的一个错误的变量名

bri*_*uck 118 python

为什么id在Python中命名变量是不好的?

Kev*_*tle 121

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.)
Run Code Online (Sandbox Code Playgroud)

通常,使用以任何语言遮蔽关键字或内置函数的变量名称都是一个坏主意,即使它是允许的.

  • @EliCourtwright我希望他们删除它.多么命名的方法!在数千个地方使用的通用名称(上下文赋予意义).所以有人决定将它用作没有上下文的全局名称? (16认同)
  • 我当然会避免使用模块全局变量.对于局限于局部范围的变量,所以你可以看到同样的函数不需要使用内置函数,这不是我担心的事情. (4认同)
  • 好的,对于'id'你是对的,但"一般......"评论仍然适用,你不觉得吗? (3认同)
  • 令人惊讶的是,谷歌自己的Python正则表达式教程(https://developers.google.com/edu/python/regular-expressions)使用`str ='一个示例词:cat !!'`.是否有任何PEP中的任何内容都表明不这样做? (2认同)

Nat*_*ers 48

id是一个内置函数,它给出了一个对象的内存地址.如果您命名其中一个功能id,则必须说__builtins__.id要获取原始功能.id除了一个小脚本之外,全局重命名都会让人感到困惑.

但是,只要使用本地名称,重复使用内置名称作为变量并不是那么糟糕.Python有许多内置函数,(1)具有通用名称,(2)无论如何都不会使用太多.使用这些作为局部变量或作为对象的成员是可以的,因为从上下文中可以明显看出您正在做什么:

例:

def numbered(filename):
  file = open(filename)
  for i,input in enumerate(file):
    print "%s:\t%s" % (i,input)
  file.close()
Run Code Online (Sandbox Code Playgroud)

一些具有诱人名字的内置插件:

  • id
  • file
  • list
  • map
  • all, any
  • complex
  • dir
  • input
  • slice
  • buffer

  • [PEP 8](https://www.python.org/dev/peps/pep-0008/),已于2013年8月1日更新,现在建议通过简单地将"_`附加到变量名称来避免混淆.请参阅[我的回答](http://stackoverflow.com/a/28091085/1497596). (8认同)
  • 值得注意的是,返回对象内存地址的 id 函数是 CPython 实现细节。还值得注意的是,该函数只需要为任何两个 _extant_ 对象返回不同的数字。如果一个对象被垃圾回收,它的 id 可能会被回收。 (2认同)

Dav*_*dRR 46

PEP 8 - Python代码样式指南中,以下指南出现在描述:命名样式部分:

  • single_trailing_underscore_ :用于避免与Python关键字冲突的约定,例如

    Tkinter.Toplevel(master, class_='ClassName')

因此,要回答这个问题,应用此指南的示例是:

id_ = 42
Run Code Online (Sandbox Code Playgroud)

在变量名中包含尾随下划线使得意图清晰(对那些熟悉PEP 8中的指导的人).

  • 很好的建议,但是“id”是一个内置函数,而不是关键字,这并不能解释为什么隐藏内置函数是不好的。 (4认同)
  • 这并没有回答实际的问题,而是为 PEP-8 命名约定 +1 (3认同)
  • @wjandrea PEP8 没有明确说明在与内置冲突的情况下如何命名变量。您可以找到适合您的解决方案。您可以使用三个尾随下划线来命名变量。但是每个理智的人都会使用与关键字冲突时使用的相同的命名约定,因为没有充分的理由根据您所隐藏的内容来更改命名约定。我想知道这有什么难理解的。 (2认同)

Seb*_*tau 41

我可能会说一些不受欢迎的东西:id()是一个相当专业的内置函数,很少用于业务逻辑.因此,我没有看到在一个紧凑且编写良好的函数中将它用作变量名的问题,其中很明显id并不意味着内置函数.

  • 如果可能的话,我仍然会避免它.即使没有其他原因也没有听到同事的​​抱怨.:-) (9认同)
  • 我完全同意:在一个小函数(以及作用域)中命名变量“id”是无害的。无论如何,很少有人使用内置的 `id`。也就是说,当一位同事用局部变量覆盖了内置的 `list` 时,我花了一段时间。所以其他人提到的一般规则仍然有意义。 (3认同)

wja*_*rea 10

其他人提到这很令人困惑,但我想详细说明原因。这是一个基于真实故事的例子。基本上,我编写了一个带有参数的类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)
Run Code Online (Sandbox Code Playgroud)

预期输出:

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)
Run Code Online (Sandbox Code Playgroud)

实际输出:

Created Employee 'Taylor Swift' at 0x7efde30ae910
Run Code Online (Sandbox Code Playgroud)

啊?我想在哪里调用 int ?这些都是内置的...

如果我把它命名为badge_idid_,我就不会遇到这个问题了。

更新:值得庆幸的是,这部分错误在 Python 3.11+ 中更加清晰:

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
Run Code Online (Sandbox Code Playgroud)


Ton*_*uža 5

在内置函数之后命名任何变量都是不好的。原因之一是因为它可能会让不知道名称被覆盖的读者感到困惑。