乐趣区

关于python:醒醒Python已经支持中文变量名啦

最近,我在翻阅两本比拟新的 Python 书籍时,发现它们都犯了一个重大的低级谬误!

这两本书别离是《Python 编程:从入门到实际》和《父与子的编程之旅》,它们都是畅销书,都在 2020 年 10 月出了新版本,都应用 Python3.7+ 版本的语法。

然而,在对于变量的命名规定局部,它们犯下了一样的谬误,即还在应用 Python2 时代的那套说辞,误以为命名仅仅反对“字母、数字和下划线”的组合。

事实上,Python3.x 曾经反对全面 Unicode 编码,比方反对应用中文作为变量名。

>>> 姓名 ="Python 猫"
>>> print(f"我是{姓名},欢送关注!")
我是 Python 猫,欢送关注!

因为我手头上没有其它样本,所以,我不确定有多少新版的书籍还在应用老的规定。然而,翻译类的书籍大概率都会有这样的问题,另外,有些不谨严的国内书籍,也可能因为借鉴了过期的资料而犯错。

如此一来,恐怕有些新接触 Python 的同学,就会造成谬误的意识。尽管这可能不会造成重大的问题,然而它终归是一个应该防止而且很容易就能防止的问题。

因而,我感觉这个话题值得聊一聊。

在编程语言中有一个很常见的概念,即标识符(identifier),通常又会称之为名字(name),用于标识出变量、常量、函数、类、符号等实体的名字。

在定义标识符时,有一些必须要思考的根本规定:

  • 它能够由哪些字符组成?
  • 它是否辨别大小写?(即大小写敏感)
  • 它是否容许呈现某些非凡的单词?(即关键字 / 保留字)

对于第一个问题,大多数的编程语言 在晚期版本 都遵循这条规定:标识符由字母、数字和下划线组成,并且不能以数字为结尾。 多数的编程语言有例外,还反对应用 $、@、% 等特殊符号(例如 PHP、Ruby、Perl 等等)。

Python 的晚期版本,确切地说是 3.0 之前的版本,就遵循以上的命名规定。上面是官网文档中的形容:

identifier ::=  (letter|"_") (letter | digit | "_")*
letter     ::=  lowercase | uppercase
lowercase  ::=  "a"..."z"
uppercase  ::=  "A"..."Z"
digit      ::=  "0"..."9"

出处:https://docs.python.org/2.7/r…

然而,这条规定从 3.0 版本起,就被突破了。最新的官网文档曾经变成了这样:

出处:https://docs.python.org/3/ref…

随着互联网的遍及,各国语言进入了国际化的语境中,编程语言也与时俱进地增长了对国际化的诉求。

Unicode(译作对立码、万国码)编码标准在 1994 年公布,随后逐渐被支流的编程语言所接收。到目前为止,至多有 73 种编程语言反对 Unicode 变量名(数据根据:https://rosettacode.org/wiki/…)。

2007 年,当 Python 正在设计划时代的 3.0 版本时,官网也思考了对 Unicode 编码的反对,于是,诞生了重要的《PEP 3131 — Supporting Non-ASCII Identifiers》。

出处:https://www.python.org/dev/pe…

事实上,除了咱们最关怀的中文,Unicode 字符集还蕴含十分十分多的内容。

在对变量命名时,上面这些用法都是可行的(审慎应用,如若被打,本猫概不负责……):

>>> ψ = 1
>>> Δ = 1
>>> ಠ_ಠ = "hello"

综上所述,某些 Python 书籍中对于变量命名规定的内容曾经过期了,不应该被其所误导!

Python 3 作为一门面向现代化 / 国际化的语言,对于 Unicode 编码有很好的反对。至于该不该在我的项目中应用中文给标识符命名,那就是另外的问题啦……

退出移动版