我注意到我不能在我的python源代码中使用所有unicode字符。
虽然
def 价(何):
完全没问题(尽管是荒谬的[可能?]),
def N(N₀, t, λ) -> 'N(t)':
这是不允许的(下标为零)。
我也不能使用其他一些字符,其中大多数我认为是字母以外的东西(例如数学运算符)。我一直认为,如果我坚持我所知道的规则,即用字母和数字组成名字,以字母作为第一个字符,一切都会好的。现在,下标零显然是一个“数字”。所以我的印象是错的。
我知道我应该避免使用特殊字符。然而,上面的函数定义(指数衰减)在我看来是完全合理的 - 因为它永远不会改变,并且它如此优雅地传达了另一个程序员使用它所需的所有信息。
因此,我的问题是,哪些字符是允许的,哪些不是?在哪里?
修改
好吧,我似乎不够清楚。我使用python3,因此不需要声明源文件的编码。显然我从中考虑了我的中文函数定义。
我的问题是关于为什么某些角色被允许在那里,而有些则不是。 下标零会引发错误,标识符中的无效字符但黑板粗体零可以正常工作。两者同样特殊我会说。
我想知道是否有任何一般规则不仅适用于我的情况,必须有。看来我的错误不是偶然的。
编辑2:
回答由BeauMartínez提供,指向我的语言参考,我应该首先看一下:
http://www.dcl.hpi.uni-potsdam.de/home/loewis/table-3131.html 似乎所有允许的字符都被选中。
答案 0 :(得分:4)
根据language reference,Python 3允许使用各种各样的字符作为标识符。
零下标字符看起来像一个数字,但它不适用于Python; Python仅将0,1,2,3,4,5,6,7,8和9视为数字。它实际上是一个字符,因此您可以将其用作标识符(就好像它是,例如,像Phi这样的希腊字符)。
重要的是,您可以轻松地使用键盘输入这些字符吗?例如,每次我必须调用你的函数时,我都不想拉出角色图。将它命名为“maximum_decay_rate”或更直观的任何用户,而不仅仅是物理专业,使您的代码更具可读性。
如果您说不允许,可能是因为您没有为源文件指定character encoding。可以通过在源文件的开头加# -*- coding: utf-8 -*-
(或编码)来指定它。
答案 1 :(得分:3)
告诉Python正确的编码是什么:
https://www.python.org/dev/peps/pep-0263/
要么...
# -*- coding: utf-8 -*-
或
# coding=utf-8
对于变量名中实际允许的字符,通常限制是字母字符,数字和下划线。
“下标零”实际上不是数字,而是下标。
答案 2 :(得分:0)
每个Unicode字符都有特定的“属性”,可以在Unicode字符数据库中找到,出于我们的目的,所谓的常规类别中的属性是最重要的。它们允许将所有字符分成大组:
L
)N
)M
)P
)S
)Z
)C
)这些组有子组,例如Lu
为Uppercase_Letter
。根据Python语言参考(3.4.1),首先应该将字符序列规范化为NFKC形式(实际上这意味着用变音符号分解字符并“简化”它们,例如将下标0
更改为正常{ {1}})。然后,标识符的开头应该是下划线或字母(整个Letter组加0
- 字母数字),加上一些其他字母符号。当我们查看允许作为标识符的延续的字符时,它会变得更有趣。另外,我们可以使用:Nl
(Decimal_Numbers
),实际上是0到9之间的数字,但有很多伪装,例如Nd
,即字符MATHEMATICAL MONOSPACE DIGIT NINE
(共70个字符);大多数标记(\U0001D7FF
),除了封闭标记(M
) - 这里我们有所有的变音符号(重音符号);来自子组Me
的所有字符 - 标点符号连接符,不仅是下划线,还有各种联系(10个字符);一些额外的数字字符(例如Ethiopic数字0到9);中间点(2个字符)。
如上所述,带有下标Pc
的{{1}}应被接受为标识符。当我尝试从Word粘贴它时,IDLE和Wing 101都将规范化的表单插入到编辑器中(即N
)。我怀疑该问题的作者试图使用无法正确规范化的下标字符。