相关疑难解决方法(0)

Python 3异常删除封闭范围内的变量,原因不明

我有以下代码:

def foo():
    e = None
    try:
        raise Exception('I wish you would except me for who I am.')
    except Exception as e:
        print(e)
    print(e)

foo()
Run Code Online (Sandbox Code Playgroud)

在Python 2.7中,它按预期运行并打印:

I wish you would except me for who I am.
I wish you would except me for who I am.
Run Code Online (Sandbox Code Playgroud)

但是在Python 3.x中,第一行是打印的,但第二行不是.它似乎删除了封闭范围中的变量,从最后一个print语句给出了以下回溯:

Traceback (most recent call last):
  File "python", line 9, in <module>
  File "python", line 7, in foo
UnboundLocalError: local variable 'e' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

几乎就像del eexcept块之后插入一个语句一样.这种行为有什么理由吗?我可以理解,如果Python开发人员想要除了块有自己的局部范围,而不是泄漏到周围的范围,但为什么必须删除先前分配的外部范围中的变量?

python exception-handling exception python-3.x

11
推荐指数
1
解决办法
934
查看次数

except-clause删除局部变量

exc = None
try:
    raise Exception
except Exception as exc:
    pass

# ...

print(exc)
Run Code Online (Sandbox Code Playgroud)

NameError:未定义名称'exc'

这曾经在Python2中工作.为什么这样改变了?如果我至少可以重新分配exc,类似于类级属性

class Foo(object):
    Bar = Bar
Run Code Online (Sandbox Code Playgroud)

但这也不能使它工作:

exc = None
try:
    raise Exception
except Exception as exc:
    exc = exc
Run Code Online (Sandbox Code Playgroud)

有什么好的提示可以实现同样的目标吗?我不想写这样的东西:

exc = None
try:
    raise Exception("foo")
except Exception as e:
    exc = e

# ...

print(exc)
Run Code Online (Sandbox Code Playgroud)

python scope python-3.x try-except

5
推荐指数
1
解决办法
200
查看次数

try块中变量的命名空间范围

关于这两个选项:

try:
    userid = get_userid()
except:
    userid = ""
Run Code Online (Sandbox Code Playgroud)

userid = ""
try:
    userid = get_userid()
except:
    pass
Run Code Online (Sandbox Code Playgroud)

是否有任何区别,特别想知道如果userid仅在try块中设置命名空间将如何工作?它们是否都具有相同的命名空间范围?

一个比另一个更受欢迎吗?

python scope exception-handling python-2.7

2
推荐指数
1
解决办法
524
查看次数