这就是我的意思:
>>> 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
属性名称可以是点表示法允许的名称的超集。
我试图弄清楚如何检查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…