。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/

10-10 15:07