Python中的Unicode标识符?

vik*_*sit 49 python unicode identifier

我想构建一个计算的Python函数,

替代文字

并且想要命名我的求和函数Σ.以类似的方式,想用Π作产品,依此类推.我想知道是否有办法以这种方式命名python函数?

def ? (..):
 ..
 ..
Run Code Online (Sandbox Code Playgroud)

也就是说,Python是否支持unicode标识符,如果是这样,有人可以为它提供一个示例吗?

谢谢!


最初的动机是我今天看到的Clojure代码,看起来像,

(defn entropy [X]
      (* -1 (? [i X] (* (p i) (log (p i))))))
Run Code Online (Sandbox Code Playgroud)

其中Σ是定义为的宏,

(defmacro ?
    ... )
Run Code Online (Sandbox Code Playgroud)

而且我觉得这很酷.


顺便说一句,为了解决一些关于可读性的评论 - 例如,有很多统计数据/ ML代码,能够用符号组合操作将非常有帮助.(特别是对于非常复杂的积分等)

?(z) = ?(N(x|0,1,1), -?, z)
Run Code Online (Sandbox Code Playgroud)

VS

Phi(z) = integral(N(x|0,1,1), -inf, z)
Run Code Online (Sandbox Code Playgroud)

甚至只是lambda()的lambda字符!

Pau*_*ite 44

(我认为它也很酷,这可能意味着我们是极客.)

您可以使用上面在Python 3中的代码执行此操作.(至少在我的Python 3.1解释器中可以使用.)请参阅:

但在Python 2中,标识符只能是ASCII字母,数字和下划线.


asm*_*rer 18

值得指出的是,Python 3 确实支持Unicode标识符,但只允许使用字母或数字符号(有关完整详细信息,请参阅http://docs.python.org/3.3/reference/lexical_analysis.html#identifiers).这就是为什么Σ有效(记住它是一个希腊字母,而不仅仅是一个数学符号),但√没有.


Pet*_*ley 14

(这个答案是一个较小的附录,而不是一个完整的答案)

unicode标识符的附加问题(当我认为这是一个很酷的线程并切换到一个终端来玩它时,@ mike-desimone提及我发现很快),每个字形的多个版本都不相同,关于你如何到达每个平台上的每个字形.例如Σ(又名希腊大写字母sigma,又名U + 03A3,[找不到直接的mac输入法])很好,但不幸的是Σ(又名N-ary Summation,又名U + 2211,又名opt/alt- w使用Mac OS X)不是有效的标识符.

>>> ? = 20
>>> ?
20
Run Code Online (Sandbox Code Playgroud)

>>> ? = 20
File "<input>", line 1
  ? = 20
  ^
SyntaxError: invalid character in identifier
Run Code Online (Sandbox Code Playgroud)

如果在多个平台上有多个开发人员为您的代码做出贡献,那么使用Σ专门(通常可能是unicode字符)作为标识符可能会产生一些非常难以诊断的错误,例如,可视化调试:

Σ看起来与Σ非常相似,具体取决于所选的字体

这两个字形在此页面上更容易区分,但根据使用的字体,可能不是这种情况.

除非在Σ附近打印Σ,否则即使回溯也不太清楚

  File "~/Dev/play_python33/identifiers.py", line 12
    print(?([2, 2, 2, 2, 2]))
            ^
SyntaxError: invalid character in identifier
Run Code Online (Sandbox Code Playgroud)

  • 另一个问题是有多个*是*等价的字形.定义`φ= 5`,然后`φ是φ`→True (6认同)
  • @endolith 这正是我今天惊恐地发现的。 (2认同)

Arn*_*ide 13

根据它是坏的,你可以使用一些unicode字符,但不是全部:你被限制为标识为字母的字符.

>>> ? = 3  
>>> ? = sum   
>>> import math  
>>> ? = math.sqrt  
  File "<stdin>", line 1  
    ? = 3  
      ^  
SyntaxError: invalid character in identifier
Run Code Online (Sandbox Code Playgroud)

此外:我认为能够使用unicode作为标识符是非常酷的 - 我希望,我可以使用所有.

我使用neo键盘布局,它在额外的图层上提供了希腊语和数学符号:

αβχδεφγψιθκλνοπφστ[&
ωξυζ∀⇐ℂΔ∃ΦΓΨ∫Λ⇔Σεℚℝ∂⊂√∩Ξ

  • 此外,通常还有不同版本的字符也是希腊字母.例如,希腊大写sigma是U + 03A3,而数学sigma是U + 1D6BA,U + 1D6F4,U + 1D72E,U + 1D768或U + 1D7A2,具体取决于样式.同样,希腊首都欧米茄是U + 03A9,数学omegas从U + 1D6C0开始,欧姆符号是U + 2126. (3认同)

Tho*_*ers 6

Python 2.x不支持unicode标识符,因此不支持Σ作为标识符.Python 3.x 确实支持unicode标识符,但是如果他们必须编辑源文件,例如标识符A和Α(拉丁语A和希腊语大写字母alpha),很多人会得到交叉.Sigma通常可读,但仍然不是为可读的文字西格玛,何必呢?

  • 我认为单词与符号的可读性取决于上下文.当我读到一些东西时,我发现符号(例如`x + y`)比你得到的罗嗦等价物更可读,比如AppleScript(例如`add x to y`).符号比较简洁,通常只让你接受形状识别,我认为这对大脑比阅读更容易.我没有做足够多的东西感觉需要在我的代码中添加一个sigma标志. (9认同)
  • "对我来说,看起来对unicode标识符来说看起来更难以理解." - 它看起来更类似于问题顶部发布的等式.如果有人习惯于阅读这样的方程式,他们可能不会发现符号-y Python代码更具可读性吗? (3认同)
  • @Paul:当然,可读性总是主观的.观众很重要.这就是为什么你需要考虑观众而不是你自己的喜好.当然,如果你总是成为你自己的整个受众,这很容易,但通常以这种方式开始的事情最终会在更广泛的分布中产生,并且会有更广泛的贡献者. (3认同)
  • Unicode标识符不错的一个地方是iPython Notebook,因为您可以使用与它们所代表的变量相同的变量名称.例如,表示芯片从结到环境的热阻抗的变量是θJA,并且不断地将其写为"THETA_JA"使得非编程人员更难以读取代码. (3认同)
  • 对我来说,unicode标识符看起来不那么可读. (2认同)