gpt4 book ai didi

python - Python中未绑定(bind)的局部变量问题

转载 作者:太空狗 更新时间:2023-10-30 00:46:42 27 4
gpt4 key购买 nike

我有以下代码片段:

def isolation_level(level):
def decorator(fn):
def recur(level, *args, **kwargs):
if connection.inside_block:
if connection.isolation_level < level:
raise IsolationLevelError(connection)
else:
fn(*args, **kwargs)
else:
connection.enter_block()
try:
connection.set_isolation_level(level)
fn(*args, **kwargs)
connection.commit()
except IsolationLevelError, e:
connection.rollback()
recur(e.level, *args, **kwargs)
finally:
connection.leave_block()
def newfn(*args, **kwargs):
if level is None: # <<<< ERROR MESSAGE HERE, Unbound local variable `level`
if len(args):
if hasattr(args[0], 'isolation_level'):
level = args[0].isolation_level
elif kwargs.has_key('self'):
if hasattr(kwargs['self'], 'isolation_level'):
level = kwargs.pop('self', 1)
if connection.is_dirty():
connection.commit()
recur(level, *args, **kwargs)
return newfn
return decorator

它做什么并不重要,但我以其原始形式发布它,因为我无法用更简单的方法重现这种情况。

问题是,当我调用 isolation_level(1)(some_func)(some, args, here) 时,我在第 21 行(标记为上市)。我不明白为什么。我尝试重新创建相同的函数结构和不包含所有实现细节的函数调用来找出问题所在。但是我当时没有收到异常消息。例如以下作品:

def outer(x=None):
def outer2(y):
def inner(x, *args, **kwargs):
print x
print y
print args
print kwargs
def inner2(*args, **kwargs):
if x is None:
print "I'm confused"
inner(x, *args, **kwargs)
return inner2
return outer2

outer(1)(2)(3, z=4)

打印:

1
2
(3,)
{'z': 4}

我错过了什么??

编辑

好的,所以问题是在第一个版本中我实际上执行了对变量的赋值。 Python 检测到这一点,因此假定该变量是本地变量。

最佳答案

局部变量在编译时确定:对变量 level 的赋值发生在错误所在行下方的几行中,使该变量成为内部函数的局部变量。所以行

if level is None:

实际上尝试访问最内层作用域中的变量level,但这样的变量还不存在。在 Python 3.x 中,你可以通过声明来解决这个问题

nonlocal level

在内部函数的开头,如果你真的想改变外部函数的变量。否则,您可以简单地在内部函数中使用不同的变量名。

关于python - Python中未绑定(bind)的局部变量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5838034/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com