标题: 从Python2往Python3移植代码
创建: 2020-06-24 20:48 更新: 2023-08-09 15:04 链接: https://scz.617.cn/python/202006242048.txt
目录:
☆ 前言
☆
1) "except SomeException, e"
2) b"some"
3) raw_input()
4) 'hello'.encode( 'hex' )
5) 浮点除法
6) str.split()
7) has_key/in
8) dict.iteritems()/dict.items()
9) eval/exec
10) No module named 'SocketServer'
11) module 'string' has no attribute 'upper'
☆ 参考资源
☆ 前言
记录自己从Python2往Python3移植代码时实际碰上的若干问题。
在流利说L7的TED中学到lagger这个词,还专门提问,如何描述lagger。回答是,这 种人一般在所有传统的、可替代的方案都无法将就时才被迫接受新方案。演讲者用的 例子是讲什么人会优先换用iPhone,什么人会最后换用iPhone。学这一课时觉得 lagger精准地描述了我,我一直坚持使用Python2,直到它终于走到了尽头。如今再 写Python代码,强迫自己使用Python3,不再死撑Python2。
☆
1) "except SomeException, e"
except SomeException, e // Python2 except SomeException as e // Python3
2) b"some"
"some" // Python2 str b"some" // Python3 bytes
对于Python3,struct.pack()、s.recv()返回的是bytes;s.send()只能发送bytes, 不能发送str。
3) raw_input()
raw_input() // Python2 input() // Python3
4) 'hello'.encode( 'hex' )
'hello'.encode( 'hex' ) // Python2 binascii.hexlify( b'hello' ) // Python3
5) 浮点除法
float(3) / 4 = 0.75 // Python2 3 / 4 = 0 // Python2 3 // 4 = 0 // Python2
float(3) / 4 = 0.75 // Python3 3 / 4 = 0.75 // Python3 3 // 4 = 0 // Python3
主要区别在于/号的意义发生变化。
6) str.split()
https://docs.python.org/2.7/library/stdtypes.html#str.split
str.split([sep[, maxsplit]])
https://docs.python.org/3.9/library/stdtypes.html#str.split
str.split(sep=None, maxsplit=-1)
Python2、Python3的str.split()函数原型有变,2不支持关键字,3支持关键字。
如下代码同时适用于Python2、Python3:
x = 'a,b,c' print( x.split(',',1))
['a', 'b,c']
如下代码只适用于Python3:
x = 'a,b,c' print( x.split(',',maxsplit=1))
Python2执行上述代码会报错:
TypeError: split() takes no keyword arguments
7) has_key/in
has_key // Python2 in // Python2 Python3
Python3没有has_key()
8) dict.iteritems()/dict.items()
dict.iteritems() // Python2 dict.items() // Python3
9) eval/exec
假设有如下函数
def exec_test () : a = 1 exec( "a=2+3" ) print( a )
Python2、Python3中exec_test执行结果不同
5 // Python2 1 // Python3
Python2、Python3的exec有重大区别,2中exec是一条语句,3中exec是一个函数,于 是2中exec可以更改父函数里的局部变量,3中exec无法更改父函数里的局部变量。
def eval_test () : a = eval( "2+3" ) print( a )
def exec_test_1 () : namespace = {} exec( "a=2+3", namespace ) print( namespace['a'] )
Python2、Python3中eval_test、exec_test_1执行结果相同
5 // Python2 5 // Python3
参看
Behavior of exec function in Python 2 and Python 3 - [2013-02-26] https://stackoverflow.com/questions/15086040/behavior-of-exec-function-in-python-2-and-python-3
10) No module named 'SocketServer'
SocketServer // Python2 socketserver // Python3
11) module 'string' has no attribute 'upper'
string.upper(foo) // Python2 foo.upper() // Python3
Python2的string.*()在Python3中都没了
☆ 参考资源