我正在尝试了解 Python 3 变量范围和nonlocal
.
考虑以下函数(这只是一个示例):
def build_property(something):
def deco(func):
def getter(self):
return getattr(self, something)
def setter(self, value):
setattr(self, something, value)
return property(getter, setter)
return deco
没有nonlocal
. 但是,如果现在我想根据something
需要非本地有条件地创建 getter 和 setter。
def build_property(something):
def deco(func):
nonlocal something # This is needed
if something.startswith('A'):
getter = None
else:
def getter(self):
return getattr(self, something)
if something.startswith('B'):
setter = None
else:
def setter(self, value):
setattr(self, something, value)
return property(getter, setter)
return deco
为什么nonlocal
在一种情况下需要,而在另一种情况下不需要?换句话说,为什么something
如果在第一种情况下正确找到(没有nonlocal
),但在第二种情况下我得到:“UnboundLocalError:在分配之前引用局部变量'某物'”如果nonlocal
不存在?