最近,我在翻阅两本比拟新的 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 编码有很好的反对。至于该不该在我的项目中应用中文给标识符命名,那就是另外的问题啦……