首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getattr和unicode属性

getattr和unicode属性
EN

Stack Overflow用户
提问于 2020-12-01 15:16:48
回答 1查看 224关注 0票数 3

由于在类、方法、变量的标识符中使用unicode字符已经成为可能,所以我越来越多地使用它们。我不知道,这是否是一个好主意,但它使代码更易读(例如,您现在可以使用import numpy as np; π = np.pi; area = r**2 * π!)

现在我注意到以下行为(在Python3.8.5中):

我可以通过以下方式定义一个类A

代码语言:javascript
复制
>>> class A:
...     def x(self):
...         print('x')
...     def ξ(self):
...         print('ξ')
...     def yₓ(self):
...         print('yₓ')

并且可以访问所有方法:

代码语言:javascript
复制
>>> a = A()
>>> a.x()
x
>>> a.ξ()
ξ
>>> a.yₓ()
yₓ

如果我想使用getattr()访问它们,就会出现问题:

代码语言:javascript
复制
>>> 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ₓ'
  1. 为什么getattr(a,'ξ')能工作,而getattr(a, 'yₓ')却不能工作?

我注意到

代码语言:javascript
复制
>>> dir(a)
[…, 'x', 'yx', 'ξ']
  1. 为什么要保留'ξ',但'yₓ'却默默地转换为'yx'?哪些是“安全”字符,哪些可以使用,从而使getattr()成功?
  2. 有没有办法,这样我就可以使用yₓ

顺便说一下,yₓ是可以使用的,但是y₂给出了一个SyntaxError: invalid character in identifier

  1. 为什么我不能使用y₂呢?

我知道,解决办法是,不要使用任何这些花哨的字符,但其中一些字符确实使代码更加可读性(至少在我看来!)…!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-01 15:24:24

非ASCII标识符在佩普3131中定义.其中说:

整个UTF-8字符串被传递给一个函数,以使字符串正常化到NFKC。

您可以使用unicodedata.normalize来测试这一点。

代码语言:javascript
复制
unicodedata.normalize("NFKC", 'ξ') # 'ξ'
unicodedata.normalize("NFKC", 'yₓ') # 'yx'

NFKC非常复杂,但是您应该能够使用循环找到安全字符。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65093243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档