。I tried to follow the approach suggested here and found in the process a behavior that I do not understand
如果我这样做了:
def foo():
try: basestring
except NameError:
print "a"
foo()
什么都没发生。
如果我在except中稍微修改了该代码:
def foo():
try: basestring
except NameError:
print "a"
basestring=str
foo()
。
。
I checked the same code outside a function:
try:
basestring
except NameError:
print("a")
basestring=str
但在那个箱子里什么也印不出来。
最佳答案
在第一种情况下,很容易在basestring
上解析名称__builtins__.basestring
。。
在第二种情况下,这很棘手。在函数内部使用名称basestring
会使该名称成为函数的局部变量。请注意,函数的本地名称是在函数定义时确定的。在执行函数的第一行时,Python已经知道名称basestring
是函数的一个局部变量。
>>> def foo():
... basestring
... potato
... errorerrorerror
...
>>> print foo.func_code.co_names
('basestring', 'potato', 'errorerrorerror')
>>> print foo.func_code.co_varnames
()
。与下面的
foo()
进行比较和对比,这将NameError
显示在potato
行上:>>> def bar():
... basestring
... potato
... errorerrorerror
... basestring = "D'Addario EXL160 Medium"
...
>>> print bar.func_code.co_names
('potato', 'errorerrorerror')
>>> print bar.func_code.co_varnames
('basestring',)
因此,引发的异常是由于在绑定到对象之前使用了一个名称,这在Python中是一个错误。。第三种情况与第一种情况类似,“局部变量”的概念不适用于全局范围。
关于python - 在异常处理中这种奇怪的行为是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40621209/