class Foo:
bar = 1
def run(self, arg1=bar): # ok
# def run(self, arg1=Foo.bar): # fail
# def run(self, arg1=self.bar): # fail
# print(bar) # fail
print(Foo.bar) # ok
print(self.bar) # ok
Foo().run()
Почему для списка аргументов и тела функции требуются разные шаблоны доступа? У них разные правила пространства имен? Где я могу найти подлинную документацию по этому поводу?
В строке, где вы пытаетесь определить значение параметра по умолчанию, нет Foo. Имя Foo становится известным после успешного анализа и компиляции тела класса, чего не произойдет до появления пустой строки. Почему ты вообще хочешь этим заниматься?
@ juanpa.arrivillaga Где упоминается список аргументов метода класса?
@DYZ Что вы здесь имеете в виду под тело класса? Вы имеете в виду, что строка с def находится внутри тела класса, но тело метода имеет новую область видимости? Я нигде не вижу, чтобы переменная класса использовалась в качестве аргумента по умолчанию для метода класса в качестве анти-шаблона, не так ли?
Подобных много, не могу понять, что это дубликат. Эти две ссылки действительно не охватывают ответ: я искал это в документации, но не нашел. При попытке использовать атрибут класса в качестве аргумента по умолчанию для метода этого класса аргументы по умолчанию оцениваются, пока / когда метод компилируется построен /, и поскольку весь класс еще не является законченный, он еще не существует. В основном то, что сказал @DYZ. Вопрос не в области охвата, а в порядке исполнения. По крайней мере, для arg1=Foo.bar и arg1=self.bar
@wwii Странно то, что вам может показаться удивительным, что вы должны использовать другой шаблон доступа для аргумента по умолчанию. Эквивалентное написание приведенного выше кода - проверить arg1 в теле метода и назначить Foo.bar, если он пуст. Однако, если вы пишете это как аргумент по умолчанию, вы отбрасываете квантификатор Foo..
@Cyker прочитайте этот отвечать, в нем подробно рассказано. Класс здесь - отвлекающий маневр. Операторы определения классов python и операторы определения функций оцениваются в время выполнения, а правила области видимости в основном согласуются с остальной частью python, за исключением того, что тела классов не создают охватывающую область над функциями, определенными внутри них. Но здесь это не актуально. Что такое другой шаблон доступа?
Распространенная идиома - использовать аргумент по умолчанию None или какое-либо другое контрольное значение и проверять if arg is None: arg = Foo.bar.






В документации: 9.1 и 9.2 в разделе "Классы" учебного пособия.. [Именование и привязка] (в модели выполнения] (docs.python.org/3/reference/executionmodel.html#execution-model) справочника по языку.