gpt4 book ai didi

python - 如何检查标识符是 dunder 还是 class-private(即会被破坏)?

转载 作者:行者123 更新时间:2023-12-04 01:19:05 25 4
gpt4 key购买 nike

我正在编写一个提供关于变量名的建议的项目,我希望它判断一个名称是否与 reserved classes of identifiers 中的任何一个匹配。 .第一个(“私有(private)”)非常简单,只是 name.startswith('_') ,但 dunder 和类私有(private)名称更复杂。有没有内置函数可以告诉我?如果不是,Python 使用的内部规则是什么?
对于dunder,检查name.startswith('__') and name.endswith('__')不起作用,因为这将匹配 '__'例如。也许像 ^__\w+__$ 这样的正则表达式会工作?
对于私有(private)类(class),name.startswith('__')不起作用,因为 dunder 名称没有被破坏,也没有像 '___' 这样只有下划线的名称.所以似乎我必须检查名称是否以两个下划线开头,不以两个下划线结尾,并且至少包含一个非下划线字符。是对的吗?在代码中:

name.startswith('__') and not name.endswith('__') and any(c != '_' for c in name)
我最关心的是边缘情况,所以我想确保我得到的规则 100% 正确。我读了 What is the meaning of single and double underscore before an object name?但没有足够的细节。

最佳答案

这是内部规则。请注意,我几乎无法阅读 C,因此请谨慎对待。
邓德
基于 is_dunder_name in Objects/typeobject.c (使用 Python 3.7 中的 str.isascii):

len(name) > 4 and name.isascii() and name.startswith('__') and name.endswith('__')
或者,该正则表达式 ^__\w+__$可以,但需要 re.ASCII 启用以确保 \w只匹配 ASCII 字符。
私有(private)类
基于 _Py_Mangle in Python/compile.c :
name.startswith('__') and not name.endswith('__') and not '.' in name
虽然严格来说,带点的名称是“属性引用”,而不是名称,因此您可以删除该检查:
name.startswith('__') and not name.endswith('__')
这符合 Identifiers (Names) 下文档中的规则.
(旁注:我没有意识到,但 not name.endswith('__') 确保名称至少包含一个非下划线。)

关于python - 如何检查标识符是 dunder 还是 class-private(即会被破坏)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62865301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com