一些utf8字符允许在python源代码中,有些则不允许

时间:2010-08-13 07:00:01

标签: unicode python-3.x

我注意到我不能在我的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 似乎所有允许的字符都被选中。

3 个答案:

答案 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

这些组有子组,例如LuUppercase_Letter。根据Python语言参考(3.4.1),首先应该将字符序列规范化为NFKC形式(实际上这意味着用变音符号分解字符并“简化”它们,例如将下标0更改为正常{ {1}})。然后,标识符的开头应该是下划线或字母(整个Letter组加0 - 字母数字),加上一些其他字母符号。当我们查看允许作为标识符的延续的字符时,它会变得更有趣。另外,我们可以使用:NlDecimal_Numbers),实际上是0到9之间的数字,但有很多伪装,例如Nd,即字符MATHEMATICAL MONOSPACE DIGIT NINE (共70个字符);大多数标记(\U0001D7FF),除了封闭标记(M) - 这里我们有所有的变音符号(重音符号);来自子组Me的所有字符 - 标点符号连接符,不仅是下划线,还有各种联系(10个字符);一些额外的数字字符(例如Ethiopic数字0到9);中间点(2个字符)。

如上所述,带有下标Pc的{​​{1}}应被接受为标识符。当我尝试从Word粘贴它时,IDLE和Wing 101都将规范化的表单插入到编辑器中(即N)。我怀疑该问题的作者试图使用无法正确规范化的下标字符。