如何检测无法通过obj.name语法访问的属性名称?

Sha*_*hay 2 python python-3.x

setattr将设置不能与常规属性访问一起使用的名称,即obj.name.

>>> from types import SimpleNamespace
>>> my_instance = SimpleNamespace()
>>> setattr(my_instance, 'from', 0)  # works
>>> getattr(my_instance, 'from')
0
>>> my_instance.from
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

如何检查这些名称,以避免使用它们?

use*_*ica 5

在Python 3上,

import keyword

type(key) is str and key.isidentifier() and not keyword.iskeyword(key)
Run Code Online (Sandbox Code Playgroud)

我们检查属性名称是否为字符串,它是否符合Python标识符的格式,并且它不是关键字.isidentifier不排除关键字,因此需要额外检查.

(是的,isinstance是一件事,但我真的不想允许str子类.)

  • 很困惑为什么你在这里吸引了投票.我本人即将发布一个链接到[关键字`模块](https://docs.python.org/3/library/keyword.html); 这正是它的用途.我的意思是,是的,你应该尽量避免使用无效字符串作为关键字/属性名称,但是如果你不能足够控制你的输入,那么这种白名单(必须是合法标识符`str`)和黑名单(但不是`keyword`)是一个不错的选择.我的投票取消了我的猜测. (2认同)
  • 是的,那就是我.代码具有误报,即它识别不一定是无效属性名称的字符串,并且此答案无法解决有关该问题的详细信息.关于此事,这是[Guido的采取](https://mail.python.org/pipermail/python-dev/2012-March/117441.html). (2认同)