Skip to content

标题: 从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中都没了

☆ 参考资源