我想了解Python 3變量範圍和nonlocal
。瞭解Python中的非本地3
考慮下面的函數(這只是一個例子):
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
不存在?
...你的問題是?你沒有*說*錯誤/意外行爲。如果您遇到異常,請在您的問題中提供**完整**回溯。如果您發現意外的行爲,您應*提供1)您期望的行爲和2)您獲得的實際產出。我們不是**算命先生。 – Bakuriu
只是出於求知慾:你的裝飾者的意義何在?你似乎沒有在任何地方使用'func' ... – glglgl
順便說一句,我沒有測試代碼,但我不明白爲什麼它應該在第二種情況下需要,因爲'something'永遠不會分配給。 .. – glglgl