标题: 从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中都没了 ☆ 参考资源