由于在类、方法、变量的标识符中使用unicode字符已经成为可能,所以我越来越多地使用它们。我不知道,这是否是一个好主意,但它使代码更易读(例如,您现在可以使用import numpy as np; π = np.pi; area = r**2 * π!)
现在我注意到以下行为(在Python3.8.5中):
我可以通过以下方式定义一个类A:
>>> class A:
... def x(self):
... print('x')
... def ξ(self):
... print('ξ')
... def yₓ(self):
... print('yₓ')并且可以访问所有方法:
>>> a = A()
>>> a.x()
x
>>> a.ξ()
ξ
>>> a.yₓ()
yₓ如果我想使用getattr()访问它们,就会出现问题:
>>> attr = getattr(a, 'x')
>>> attr()
x
>>> attr = getattr(a, 'ξ')
>>> attr()
ξ
>>> attr = getattr(a, 'yₓ')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'yₓ'
'A' object has no attribute 'yₓ'getattr(a,'ξ')能工作,而getattr(a, 'yₓ')却不能工作?我注意到
>>> dir(a)
[…, 'x', 'yx', 'ξ']'ξ',但'yₓ'却默默地转换为'yx'?哪些是“安全”字符,哪些可以使用,从而使getattr()成功?yₓ了顺便说一下,yₓ是可以使用的,但是y₂给出了一个SyntaxError: invalid character in identifier
y₂呢?我知道,解决办法是,不要使用任何这些花哨的字符,但其中一些字符确实使代码更加可读性(至少在我看来!)…!
发布于 2020-12-01 15:24:24
非ASCII标识符在佩普3131中定义.其中说:
整个UTF-8字符串被传递给一个函数,以使字符串正常化到NFKC。
您可以使用unicodedata.normalize来测试这一点。
unicodedata.normalize("NFKC", 'ξ') # 'ξ'
unicodedata.normalize("NFKC", 'yₓ') # 'yx'https://stackoverflow.com/questions/65093243
复制相似问题