У меня есть следующий фрагмент кода:
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, здесь)
Я получаю исключение несвязанной локальной переменной
в строке 21 (отмечено в листинге). Не понимаю почему. Я попытался воссоздать ту же структуру функций и вызовов функций, которая не t содержать все детали реализации, чтобы выяснить, что не так. Однако тогда я не получаю сообщения об исключении. Например, работает следующее:
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}
Что мне не хватает ??
EDIT
Хорошо, проблема в том, что в первой версии я фактически выполняю присвоение переменной. Python обнаруживает это и поэтому предполагает, что переменная является локальной.