Я пытаюсь понять переменную 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
Мне нужно нелокальное.
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
BTW, я не тестировал код, но я не понимаю, почему он должен понадобиться во втором случае, поскольку' something' никогда не назначается. .. – glglgl