为什么属性名称不能是 Python 关键字?

2024-02-24

Python 中对属性访问的语法有限制(至少在 CPython 2.7.2 实现中):

>>> class C(object): pass
>>> o = C()
>>> o.x = 123  # Works
>>> o.if = 123
    o.if = 123
       ^
SyntaxError: invalid syntax

我的问题有两个:

  1. 使用 Python 关键字属性名称是否有根本原因(如o.if = 123) 是禁止的?
  2. 上述对属性名称的限制是否/在哪里记录?

这样做是有意义的o.class = …,在我的一个程序中,我对无法做到这一点感到有点失望(o.class_可以,但看起来并不那么简单)。

PS: 问题很明显if and class是Python关键字。问题是why使用关键字作为属性名称将被禁止(我没有看到表达式中有任何歧义o.class = 123),以及这是否是记录在案.


因为当关键字始终是关键字而不是上下文时,解析器会更简单(例如if在语句级别时是关键字,但在表达式内部时只是标识符 - forif这会加倍困难,因为X if C else Y, and for用于列表推导式和生成器表达式)。

因此,代码甚至没有达到属性访问的程度,它只是被解析器拒绝,就像不正确的缩进一样(这就是为什么它是一个SyntaxError, 并不是AttributeError或者其他的东西)。它并不区分你是否使用if作为属性名称、变量名称、函数名称或类型名称。它永远不可能是标识符,因为解析器总是为其分配“关键字”标签,并使其成为与标识符不同的标记。

大多数语言都是一样的,语言语法(+词法分析器规范)就是相关的文档。语言规范明确提到了它 http://docs.python.org/reference/lexical_analysis.html#identifiers。它在 Python 3 中也没有改变。

另外,仅仅因为您可以使用setattr or __dict__使用保留名称创建属性并不意味着您should。不要强迫自己/API用户使用getattr而不是自然的属性访问。getattr应该在需要访问变量属性名称时保留。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么属性名称不能是 Python 关键字? 的相关文章

随机推荐

  • 科尔多瓦人行横道不建造

    我相信我下载过的每个版本的 Crosswalk Cordovahttps download 01 org crosswalk releases crosswalk android https download 01 org crosswal
  • 带有 Express.js 虚拟主机的子域上的 Socket.IO

    我的服务器上运行着两个 Express js 应用程序 一个普通的应用程序称为 main app 另一个使用 Socket IO 的应用程序称为 socket app 我在 mydomain com 上运行 main app 在 socke
  • 构建 VLC 时需要 NDKv8b 或更高版本

    我已经在 android 中构建了 VLC 并使用代码实现 jack export ANDROID SDK android sdk jack export ANDROID NDK android ndk r9d jack export PA
  • 设置 UITableViewCell 的动态高度,其中仅包含图像(可变高度)

    我有一个 UITableView 其单元格仅包含可变高度的图像 我根据图像动态设置行高 它不能完美工作 滚动时的图像有时会重叠 这是代码 NSInteger numberOfSectionsInTableView UITableView t
  • Symfony2 中的路由

    如何在 Symfony2 中设置默认路由 在 Symfony1 中它看起来像这样 homepage url param module default action index default symfony url symfony acti
  • 是什么阻止我在我的开发盒上专门使用 IIS Express?

    我只阅读了一些有关 IIS Express 的内容 并且正在阅读并立即安装 看来我应该能够正确卸载 IIS 并在 Visual Studio 2010 SP1 中开发 调试基于 Web 服务器的技术时使用 IIS Express 这是一个明
  • Facebook 不从 og:image 加载图像

    它已经可以工作了 但今天我很惊讶 当我尝试分享链接时 Facebook 没有显示来自 og image 元标记的图像 from 脸书调试器 http developers facebook com tools debug og object
  • 使用 Google 脚本永久删除我的电子邮件的脚本

    Gmail Users Messages remove userId id 是如何工作的 电子邮件的 ID 是什么 永久删除电子邮件的正确功能是什么 就我而言 我想立即明确地删除所有已发送的电子邮件 这是我从某人那里获取的一些代码 只是带有
  • Python 和“re”

    我在 python 中关于 Regex 的教程解释了如何在 python 中使用 re 模块 我想从 A 标签中获取 URL 因此知道 Regex 我编写了正确的表达式 并在我选择的正则表达式测试应用程序中对其进行了测试并确保它工作了 当放
  • 如何在 OSX Catalina (10.15) 中使用 Wireshark 捕获 USB 流量

    我正在尝试让 Wireshark USB 捕获工作 显然 Catalina 之前的技巧就是调出界面 以便 Wireshark 可以看到它 https forums developer apple com thread 95380 https
  • ggplot2 具有多个参数的绘图函数

    我得到了这个功能 change lt function score d k p k score 1 1 k d p 我想在一个图中绘制该函数对于一系列参数 d 和 p 的所有结果 在 r 基数中 就是这样 parameters lt c 1
  • Django:如何重定向到表单起源的页面

    在我的 Django 应用程序中 我有多个页面显示一个链接 该链接加载一个显示表单的新页面 提交表单后 重定向到访问该表单的原始页面的最简洁方法是什么 原始页面 gt 表单页面 gt 原始页面 使用下一个变量似乎不太优雅 因为我必须将其设置
  • 证书基本约束的路径长度

    对于 CA 类型的基本约束 路径长度为 0 和 None 是否相同 澄清一下 路径长度为 0 是否意味着 CA 不能颁发证书 而路径长度为 none 是否意味着它可以颁发无限数量的证书 取自RFC 5280 https www rfc ed
  • 为什么人们在 PHP 框架中使用单例

    好吧 伙计们 我很难理解为什么需要单例 让我们举一个真实的例子 我有一个 CMS 框架我需要一个记录一些信息的类 让我们继续使用 PHP Example class Logger private logs array public func
  • 插入特定行数

    我正在尝试插入特定数量的行 现在我正在使用下面的代码插入 4 行 我正在尝试编写一行代码 该代码将根据特定单元格中的数字插入特定数字或行 例如 如果我想插入 4 行 并且单元格 A2 是我可以更改要添加的行数的单元格 那么我将使用什么代码根
  • ld:找不到 -lgcc_s.10.5 Xcode 的库

    ld library not found for lgcc s 10 5 collect2 ld returned 1 exit status Command Developer Platforms iPhoneSimulator plat
  • 为什么消费者在使用 Java 客户端 API 在 DC/OS 上消费来自 Kafka 的消息时会挂起?

    我在 AWS 上的 DC OS Mesos 集群上安装了 Kafka 启用三个代理并创建一个名为 topic1 的主题 dcos kafka topic create topic1 partitions 3 replication 3 然后
  • 从 ES6 map() 函数返回多个值

    假设我有这样的事情 let values 1 2 3 4 let newValues values map v gt return v v console log newValues 1 4 9 16 非常简单 现在 如果我想为每个对象返回
  • 如何使用 useEffect 设置参数并避免无限渲染?

    我在用着react navigation我有一个动态标题 所以我使用setParams并将其放在标题中 const MyComponent navigation gt useEffect gt const setParams state n
  • 为什么属性名称不能是 Python 关键字?

    Python 中对属性访问的语法有限制 至少在 CPython 2 7 2 实现中 gt gt gt class C object pass gt gt gt o C gt gt gt o x 123 Works gt gt gt o if