我正在动态创建python类,我知道并非所有字符在此上下文中都是有效的。
我可以在类库中某处使用某种方法来清理随机文本字符串,以便将其用作类名吗?那个或者允许的字符列表将是一个很好的帮助。
关于与标识符名称冲突的补充: 就像在下面的答案中指出的@Ignacio一样,任何可以有效用作标识符的字符都是类名中的有效字符。您甚至可以毫无保留地将保留字用作类名。但是有一个陷阱。如果您确实使用保留字,则将无法像其他(非动态创建的)类一样使该类可访问(例如,通过执行globals()[my_class.__name__] = my_class)。在这种情况下,保留字始终优先。
globals()[my_class.__name__] = my_class
Python 3
Python语言参考,第2.3节,“标识符和关键字”
Python中标识符的语法基于Unicode标准附件UAX-31,其详细说明和更改如下所述;有关更多详细信息,另请参阅PEP 3131。 在ASCII范围(U + 0001..U + 007F)中,标识符的有效字符与Python 2.x中的相同:大写字母和小写字母A至Z,下划线_和(除第一个字符外),数字0到9。 Python 3.0引入了ASCII范围之外的其他字符(请参阅PEP 3131)。对于这些字符,分类使用unicodedata模块中包含的Unicode字符数据库的版本。 标识符的长度是无限的。情况很重要。 identifier ::= xid_start xid_continue* id_start ::= <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property> id_continue ::= xid_start ::= xid_continue ::= 上面提到的Unicode类别代码代表: Lu-大写字母 LL-小写字母 LT-标题字母 LM-修饰字母 罗-其他字母 NL-字母数字 Mn-非间距标记 麦克间距组合标记 Nd-十进制数 PC-连接器标点符号 Other_ID_Start-PropList.txt中的显式字符列表,以支持向后兼容 Other_ID_Continue-同样 解析时,所有标识符都转换为标准形式NFKC;标识符的比较基于NFKC。 可以在https://www.dcl.hpi.uni- potsdam.de/home/loewis/table-3131.html上找到列出Unicode 4.1的所有有效标识符字符的非规范HTML文件。
Python中标识符的语法基于Unicode标准附件UAX-31,其详细说明和更改如下所述;有关更多详细信息,另请参阅PEP 3131。
在ASCII范围(U + 0001..U + 007F)中,标识符的有效字符与Python 2.x中的相同:大写字母和小写字母A至Z,下划线_和(除第一个字符外),数字0到9。
Python 3.0引入了ASCII范围之外的其他字符(请参阅PEP 3131)。对于这些字符,分类使用unicodedata模块中包含的Unicode字符数据库的版本。
标识符的长度是无限的。情况很重要。
identifier ::= xid_start xid_continue* id_start ::= <all characters in general categories Lu, Ll, Lt, Lm,
Lo, Nl, the underscore, and characters with the Other_ID_Start property> id_continue ::= xid_start ::= xid_continue ::=
上面提到的Unicode类别代码代表:
解析时,所有标识符都转换为标准形式NFKC;标识符的比较基于NFKC。
可以在https://www.dcl.hpi.uni- potsdam.de/home/loewis/table-3131.html上找到列出Unicode 4.1的所有有效标识符字符的非规范HTML文件。
Python 2
标识符(也称为 名称 )由以下词汇定义描述: identifier ::= (letter|"_") (letter | digit | "_")* letter ::= lowercase | uppercase lowercase ::= "a"..."z" uppercase ::= "A"..."Z" digit ::= "0"..."9" 标识符的长度是无限的。情况很重要。
标识符(也称为 名称 )由以下词汇定义描述:
identifier ::= (letter|"_") (letter | digit | "_")* letter ::= lowercase | uppercase lowercase ::= "a"..."z" uppercase ::= "A"..."Z" digit ::= "0"..."9"