我有以下代码:
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 e在except块之后插入一个语句一样.这种行为有什么理由吗?我可以理解,如果Python开发人员想要除了块有自己的局部范围,而不是泄漏到周围的范围,但为什么必须删除先前分配的外部范围中的变量?
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) 关于这两个选项:
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块中设置命名空间将如何工作?它们是否都具有相同的命名空间范围?
一个比另一个更受欢迎吗?