【问题标题】:Why isn't 'list' a reserved word in Python?为什么“列表”不是 Python 中的保留字?
【发布时间】:2013-02-04 20:00:07
【问题描述】:

如果list 是 Python 中的保留字,我刚刚被一个错误所困扰。 (可以肯定的是,我是 Dumbery。)

那么为什么 list(或 dict 或 float 或任何类型)不是保留字?添加解释器错误似乎比尝试记住规则更容易。

(我也知道 Eclipse/PyDev 有一个设置会提醒你这条规则,这很有用。)

【问题讨论】:

  • 假设list 是保留字。那么如果你想要这样做,你会如何改变它所指的类型呢?
  • 如果您担心这类错误,请使用pylintpyflakes 等。例如,pylint 会给您"W: 3, 0: Redefining built-in 'list'
  • @kindall:这是内置类型的常见用例吗?
  • 普通?一点也不。但是为什么不应该你能够重新定义内置函数?
  • @kindall:可读性?也许这是我的经验不足,但在这种情况下,定义_list_dict 会花费你多少行代码?如果有一条规则或约定说“永远不要这样做”,在我看来,这表明你应该让它变得难以做到。

标签: python python-2.7


【解决方案1】:

只保留keywords

list 不是关键字而是内置类型,strsetdictunicodeintfloat 等也是如此。

保留所有可能的内置类型是没有意义的; python 是一种动态语言,如果你想用一个隐藏它的本地名称替换内置类型,你应该可以。

list 和其他类型视为对象类型的预导入库;您也不希望 collections 中的 defaultdict 被保留吗?

使用static code analyzer 来捕获此类错误;大多数 IDE 都可以让您轻松集成其中一个。

【讨论】:

  • 这已经在邮件列表中提到了大约每年一次,人们建议它至少应该是一个警告,如果不是错误的话。第一次,共识是,“这不应该在语言中,但应该有人建立一个好的 linter。”从那以后,每一次都是“人们已经建立了已经解决这个问题的好 linter,所以使用它。”如果有人有任何这些主题的链接来给出理由,那可能会有所帮助。
  • @abarnert:我能找到的只是关于从 2000 年开始允许关键字作为 IronPython 标识符的讨论......
  • 是的,我在发布之前自己搜索了它,但找不到更容易的东西。但我知道我已经看到它反复出现,形式从“None 应该是一个关键字”到“内置的所有东西都应该是一个关键字”,有时引用解释器优化机会而不是错误检查......哦,好吧,我认为答案已经足够好了。
  • @abarnert:呵呵,发现了一个有趣的线程,有人建议None 应该发出类方法的信号(def somemethod(None, arg1, arg2):)。很高兴我们得到了描述符!
  • 如果你从 2000 年左右开始挖掘令人尴尬的愚蠢线程,我将停止制作 cmets,这样你就不会开始猜测哪些糟糕的、幸运地被拒绝的建议是我的……
【解决方案2】:

看看这个:http://docs.python.org/2/reference/lexical_analysis.html#keywords

list 只是一个类型,不是保留的(intfloatdictstr...你明白了)。

【讨论】:

    【解决方案3】:

    可能与哪些类没有私有属性的原因相同。这就是 Python 的精神。

    【讨论】:

      【解决方案4】:

      这是一个意见问题,但这是我的 2c。

      保留关键字很重要,因为本质上这意味着您永远不能在代码中使用该关键字,因此通常认为保持列表简短的良好编程语言设计。 (perl 没有,但是 perl 与大多数其他编程语言有完全不同的理念,并在变量前使用特殊符号来防止冲突)。

      无论如何,要了解为什么会出现这种情况,请考虑前向兼容性。想象一下,python 开发人员认为array 是一个如此基本的概念,以至于他们想将其设为内置(并非不可思议——这发生在set 中,嗯,python 2.6?)。如果内置函数被自动保留,那么任何以前使用array 做其他事情的人(即使明确导入为from superfastlist import array),或者实现了他们自己的(numpy 已经这样做了),会突然发现他们的代码不会不行,他们会很生气的。

      (就此而言,请考虑是否将 help 设为保留字 - 包括 argparse 在内的无数库使用 help 作为关键字参数)

      【讨论】:

      • 我想说的是,做出向后兼容的决定对 Python 来说并非没有历史先例。我想我看到 list (或 int 或 dict )不是作为定时炸弹的保留字这一事实——除非你花大量时间调试某些东西,否则你不会知道自己犯了错误。我认为权衡是您获得了可用性,但损失相对较少。
      猜你喜欢
      • 2018-01-02
      • 1970-01-01
      • 2015-11-06
      • 2022-11-21
      • 2011-11-02
      • 2014-04-17
      • 2013-12-08
      • 2010-10-06
      • 2019-01-10
      相关资源
      最近更新 更多