2017-09-01 107 views
2

最近,我一直在阅读关于Python源代码编码,尤其是PEP 263PEP 3120在Python中定义unicode变量

我有以下代码:

# coding:utf-8 

s = 'abc∂´ƒ©' 
ƒ = 'My name is' 
ß = '˚ß˙ˆ†ˆ∆ ßå®åø©ˆ' 
print('s =', s) 
print('ƒ =', ƒ, 'ß =', ß) 

此代码工作正常Python3,但结果在Python2.7一个SyntaxError
我明白,这可能与源代码编码无关。
所以,我想知道是否有办法在Python2中支持Unicode变量名称。总之,我也很难找出PEP准确解决哪些实用问题,以及我如何利用所提出的解决方案(以及在哪里)。我已阅读了一些相同的讨论,但他们没有提出一个回答我的问题,而正确的语法的解释:

回答

7

不,Python 2只支持ASCII名称。从the language reference

identifier ::= (letter|”_”) (letter | digit | “_”)* 
letter  ::= lowercase | uppercase 
lowercase ::= “a”…”z” 
uppercase ::= “A”…”Z” 
digit  ::= “0”…”9” 

相比的更长Python 3 version,里面确实有完整的Unicode名。

PEPs解决的实际问题是,如果一个源文件(比如在一个unicode字符串中)中出现了一个超过127的字节,那么Python无法知道该字符是什么意思,因为它可能是任何编码。现在默认情况下它被解释为UTF-8,并且可以通过添加这样的头部来改变。

+0

我很抱歉,但我无法理解的“一个意思字节超过127“?你的意思是说一个角色的ASCII码超过127吗? –

+0

是的。 ASCII定义了字节0到127的含义。几乎所有您将看到的编码都将这些值编码为与ASCII相同。但127以上的值不是ASCII,通常在不同的编码中是完全不同的字符。 – RemcoGerlich

+1

这是一篇经典文章:https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character集 - 无借口/。 – RemcoGerlich

2

我不认为这两篇文章是关于编码的意思,例如你的变量名称是一个Beta符号,而是关于变量值中的编码。

所以如果你改变你的代码,以这个例子:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

a = 'abc?´ƒ©' 
b = 'My name is' 
c = '°ß?ˆ†ˆ? ßå®åø©ˆ' 
print 'a =', a # by the way, the brackets are only used in python 3, so they are also being displayed when running the code in python 2.7 
print 'b =', b, 'c =', c 

希望这能回答你的问题

问候 框架

+0

这将是一个解决问题的方法,而不是解决方案。顺便说一下,我的问题在于Python2和Python3之间的互操作性。 –

+3

@KshitijSaraogi你不能期望版本之间有完美的互操作性,在Python 3中你可以做的事情是你在Python 2中无法做到的。变量名称的特殊字符就是其中之一。 –