一尘不染

python类名称中的有效字符

python

我正在动态创建python类,我知道并非所有字符在此上下文中都是有效的。

我可以在类库中某处使用某种方法来清理随机文本字符串,以便将其用作类名吗?那个或者允许的字符列表将是一个很好的帮助。


关于与标识符名称冲突的补充:
就像在下面的答案中指出的@Ignacio一样,任何可以有效用作标识符的字符都是类名中的有效字符。您甚至可以毫无保留地将保留字用作类名。但是有一个陷阱。如果您确实使用保留字,则将无法像其他(非动态创建的)类一样使该类可访问(例如,通过执行globals()[my_class.__name__] = my_class)。在这种情况下,保留字始终优先。


阅读 173

收藏
2020-12-20

共1个答案

一尘不染

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 2

Python语言参考,第2.3节,“标识符和关键字”

标识符(也称为 名称 )由以下词汇定义描述:

identifier ::=  (letter|"_") (letter | digit | "_")*
letter     ::=  lowercase | uppercase
lowercase  ::=  "a"..."z"
uppercase  ::=  "A"..."Z"
digit      ::=  "0"..."9"

标识符的长度是无限的。情况很重要。

2020-12-20