日志

醒醒!Python已经支持中文变量名啦!

 来源    2021-01-13    0  

最近,我在翻阅两本比较新的 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/reference/lexical_analysis.html#identifiers

但是,这条规则从 3.0 版本起,就被打破了。最新的官方文档已经变成了这样:

出处:https://docs.python.org/3/reference/lexical_analysis.html#identifiers

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

Unicode(译作统一码、万国码)编码标准在 1994 年发布,随后逐步被主流的编程语言所接纳。到目前为止,至少有 73 种编程语言支持 Unicode 变量名(数据依据:https://rosettacode.org/wiki/Unicode_variable_names)。

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

出处:https://www.python.org/dev/peps/pep-3131

事实上,除了我们最关心的中文,Unicode 字符集还包含非常非常多的内容。

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

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

综上所述,某些 Python 书籍中关于变量命名规则的内容已经过时了,不应该被其所误导!

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

相关文章
怎么让 Lua 5.3.4 支持中文变量名和中文函数名
日志1. 在官网下载最新版Lua源码 Lua :Download 2. 解压后进入目录,找到/src/llex.c,打开修改 找到如下内容 修改为下面代码,并保存. default: { if (lisl ...
1
python – 使用string作为变量名
问答我有什么方法可以使用字符串来调用类的方法吗?这是一个有希望更好地解释的例子(使用我认为的方式): class helloworld(): def world(self): print "He ...
1
python load mat 并按变量名赋值
日志import numpy as np import scipy.io as io creat = locals() tmp = io.loadmat("all.mat") for ...
1
[Python]Python使用动态的变量名
日志当我们在使用Python处理一些重复性很高的事情时,有时候需要很多的变量来存放一些暂行性的数据,由于这些变量的数量很大,所以这使我们就会想到能不能使用循环来像生成数据值一样生成变量名呢,当然是可以的 ...
1
在python中将字符串的一部分转换为变量名
问答我有一个包含如下文本的文件: loadbalancer { upstream application1 { server 127.0.0.1:8082; server 127.0.0.1:8083; ...
3
给出Python中变量名的列表,如何创建一个具有变量名称作为键的字典(到变量的值)?
问答我有一个变量名列表,如下所示: ['foo', 'bar', 'baz'] (我原来问我如何转换变量列表,请参见下面的Greg Hewgill的答案.) 如何将它转换为字典,其中键是变量名(如字符串) ...
2
python – 将变量名转换为字符串?
问答我想把一个python变量名转换成等效的字符串,如图所示.任何想法如何? var = {} print ??? # Would like to see 'var' something_else = 3 ...
1
如何在python中将字符串转换为有效的变量名?
问答我需要将任意字符串转换为python中有效变量名的字符串. 这是一个非常基本的例子: s1 = 'name/with/slashes' s2 = 'name ' def clean(s): s = s ...
2
python – Pandas:使用变量创建具有变量名称中的一个行名和列名的数据帧
问答假设我在Python中有一些变量.我正在尝试创建一个1行的Pandas数据帧,其中列名称是变量的名称,行中的值来自变量. 例如,如果我有这个代码: pi = 3.142 e = 2.718 phi = ...
1
python – 作为变量名的数字,statsmodels.formula.api无法识别
问答请考虑以下示例: import pandas as pd from pandas import DataFrame import statsmodels.formula.api as smf df = ...
3
如何从python中的字符串中提取变量名和值
问答我有一个字符串 data = "var1 = {'id': '12345', 'name': 'John White'}" 有没有办法在python中提取var1作为python变 ...
1
python – 为什么有些包含在Django中需要字符串和其他变量名?
问答参考Django Book, chapter 3: from django.conf.urls import patterns, include, url # Uncomment the next t ...
4
Vim与python支持环境变量
问答如果我输入vim命令行 :python import os;print os.getenv('PYTHONPATH') 我走了一条路 如果我关闭vim并在同一个终端上做 echo $PYTHONPAT ...
1
我们如何在python中打印变量名及其值,这在调试期间是否有用?
问答我多次写过类似的东西: print 'customer id: ', customerId 我想有一个函数,它打印变量名称和值 >>myprint(customerId) >> ...
1
如何使用GDB的新python支持将变量赋值给python?
问答最近我惊讶地看到当前版本的GDB支持python scrippting,这很可能意味着我可以在调试程序时绘制变量 – 这是我很久以前梦寐以求的.但是,我很快就陷入困境,因为我无法从"GDB& ...
1
Python中的变量名不能以数字开头,还是可以?
问答这有点学术性,但是. Python语法禁止用数字启动变量名.但这样可以像这样回避: >>> globals()['1a'] = 1 >>> globals()['1 ...
2
‘id’在Python中是一个坏的变量名
问答为什么在Python中命名变量id很不好?::id()是一个基本的内置函数: Help on built-in function id in module __builtin__: 06000 一般来 ...
3
如何编写一个函数来返回Python中的变量名
问答我想要一个可以像这样返回变量/对象名称的函数: def get_variable_name (input_variable): ## some codes >>get_variable_n ...
5
如何在python中为长名称选择合适的变量名
问答我需要帮助为具有长实际名称的变量选择适当的名称.我读过pep8文档,但我找不到解决这个问题. 你会将very_long_variable_name重命名为vry_lng_var_nm,还是将它保留原样 ...
1
如果您在python中单独写一个变量名,会发生什么?
问答最近我变得很好奇,但是在以下伪造的Python代码的第2行中发生了什么: def my_fun(foo,bar): foo return foo + bar 我感兴趣的原因是我正在尝试Light Ta ...
1