Python 如何检查标识符是dunder还是class private(即将被损坏)?

Python 如何检查标识符是dunder还是class private(即将被损坏)?,python,identifier,magic-methods,name-mangling,Python,Identifier,Magic Methods,Name Mangling,我正在写一个项目,提供关于变量名的建议,我想让它知道一个名称是否匹配任何一个变量。第一个(“private”)非常简单,只是name.startswith(“”“),但是dunder和class private名称更复杂。是否有任何内置函数可以告诉我?如果不是,Python使用的内部规则是什么 对于dunder,检查name.startswith(“”)和name.endswith(“”“”)不起作用,因为这将匹配“”。也许像^\uuw+\uu$这样的正则表达式可以工作 对于类private,n

我正在写一个项目,提供关于变量名的建议,我想让它知道一个名称是否匹配任何一个变量。第一个(“private”)非常简单,只是
name.startswith(“”“)
,但是dunder和class private名称更复杂。是否有任何内置函数可以告诉我?如果不是,Python使用的内部规则是什么

对于dunder,检查
name.startswith(“”)和name.endswith(“”“”)
不起作用,因为这将匹配
“”
。也许像
^\uuw+\uu$
这样的正则表达式可以工作

对于类private,
name.startswith(“\uuuuu”)
不起作用,因为dunder名称没有损坏,也没有像
“\uuuuuuuuu”这样只带下划线的名称。因此,我似乎必须检查名称是否以两个下划线开头,是否以两个下划线结尾,是否至少包含一个非下划线字符。是这样吗?代码:

name.startswith('__') and not name.endswith('__') and any(c != '_' for c in name)

我最关心的是边缘情况,所以我想确保规则100%正确。我读了,但没有足够的细节。

以下是内部规则。请注意,我几乎看不懂C,所以请对此持保留态度

敦德 基于(使用Python 3.7中的
str.isascii
):

或者,regex
^\uuuw+\uuuu$
可以工作,但需要启用它以确保
\w
仅匹配ASCII字符

班级私人 基于:

严格来说,带点的名称是“属性引用”,而不是名称,因此可以删除该检查:

name.startswith('__') and not name.endswith('__')
这与下面文档中的规则相匹配


(旁注:我没有意识到,但是
不是name。endswith(“uu”)
确保名称至少包含一个非下划线。)

混乱规则是,因此您不必解析C代码;)@zvone,嗯,这没有提到“无点”要求,所以我猜它使用了更严格的“标识符”定义。。。这是有道理的,真的。标识符是一个“属性引用”,而不是标识符本身。
name.startswith('__') and not name.endswith('__') and not '.' in name
name.startswith('__') and not name.endswith('__')