Python新手常见问题九:不能区分py2和py3

python

不能区分Python 2和Python 3

看下面这个文件foo.py:

import sys

def bar(i):

    if i == 1:

        raise KeyError(1)

    if i == 2:

        raise ValueError(2)

 

def bad():

    e = None

    try:

        bar(int(sys.argv[1]))

    except KeyError as e:

        print('key error')

    except ValueError as e:

        print('value error')

    print(e)

 

bad()

在Python 2里,运行起来没有问题:

$ python foo.py 1

key error

1

$ python foo.py 2

value error

2

但是如果拿到Python 3上面玩玩:

python3 foo.py 1

key error

Traceback (most recent call last):

  File "foo.py", line 19, in <module>

    bad()

  File "foo.py", line 17, in bad

    print(e)

UnboundLocalError: local variable 'e' referenced before assignment

这是怎么回事?“问题”在于,在Python 3里,在except块的作用域以外,异常对象(exception object)是不能被访问的。(原因在于,如果不这样的话,Python会在内存的堆栈里保持一个引用链直到Python的垃圾处理将这些引用从内存中清除掉。更多的技术细节可以参考这里。)

相关推荐:《Python相关教程》

避免这样的问题可以这样做:保持在execpt块作用域以外对异常对象的引用,这样是可以访问的。下面是用这个办法对之前的例子做的改动,这样在Python 2和Python 3里面都运行都没有问题。

import sys

 

def bar(i):

    if i == 1:

        raise KeyError(1)

    if i == 2:

        raise ValueError(2)

 

def good():

    exception = None

    try:

        bar(int(sys.argv[1]))

    except KeyError as e:

        exception = e

        print('key error')

    except ValueError as e:

        exception = e

        print('value error')

    print(exception)

 

good()

在Py3k里面运行:

$ python3 foo.py 1

key error

1

$ python3 foo.py 2

value error

2

相关推荐:

Python新手常见问题八:标准库模块命名

以上是 Python新手常见问题九:不能区分py2和py3 的全部内容, 来源链接: utcz.com/z/521358.html

回到顶部