setattr接受无效的标识符 - python

这就是我的意思:

>>> class Foo:
        pass

>>> foo = Foo()
>>> setattr(foo, "@%#$%", 10)
>>> foo.@%#$%
SyntaxError: invalid syntax
>>> getattr(foo, "@%#$%")
10
>>> foo.__dict__
{'@%#$%': 10}

我查找了它,并在python 2的问题跟踪器上将其调出了两次:

https://bugs.python.org/issue14029

https://bugs.python.org/issue25205

而对于python 3:

https://bugs.python.org/issue35105

他们坚持认为这不是错误。然而,这种行为显然不是故意的。没有任何版本的文档。这有什么解释?看起来好像很容易忽略的东西,但是感觉就像在地毯下扫了一下。那么,setattr的行为背后是否有任何原因,还是仅仅是python的良性特性?

参考方案

错误是指在不应该发生的情况下发生的事情,也就是说,在某种禁止该行为的通信方法下。如果没有文档说明不应发生这种情况,那么(最坏的情况)是一种特质,而不是错误。
Python文档中似乎没有任何内容禁止使用点符号(毕竟,只是语法糖)不能使用的属性名称,例如foo.@%#$%。唯一提及的是它们等效的示例,具体来说:

例如,setattr(x, 'foobar', 123)等效于x.foobar = 123

唯一的限制似乎是该类本身是否允许它:

如果对象允许,该函数将值分配给属性。

从更正式的意义上讲,点符号指定为here:

6.3.1。属性参考
属性引用是一个主要引用,后跟一个句点和一个名称:attributeref ::= primary "." identifier
primary必须评估为支持属性引用的类型的对象,大多数对象都会这样做。然后要求该对象产生名称为identifier的属性。可以通过覆盖__getattr__()方法来定制此产品。

请注意该语法中的identifier,根据here,它具有超出实际属性名称的限制,并且PEP 3131是对允许内容的更详细说明(是PEP将标识符移入了非ASCII世界)。
由于标识符的限制比字符串所允许的限制更严格,因此getattr/setattr属性名称可以是点表示法允许的名称的超集。

Python:检查是否存在维基百科文章 - python

我试图弄清楚如何检查Wikipedia文章是否存在。例如,https://en.wikipedia.org/wiki/Food 存在,但是https://en.wikipedia.org/wiki/Fod 不会,页面只是说:“维基百科没有此名称的文章。”谢谢! 参考方案 >>> import urllib >>> prin…

Python Pandas导出数据 - python

我正在使用python pandas处理一些数据。我已使用以下代码将数据导出到excel文件。writer = pd.ExcelWriter('Data.xlsx'); wrong_data.to_excel(writer,"Names which are wrong", index = False); writer.…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…