Ответ 1
В отличие от того, что говорят разные комментаторы, в Python возможна обработка исключений "возобновление на ошибку". Библиотека fuckit.py
реализует указанную стратегию. Это ошибки паролей, переписывая исходный код вашего модуля во время импорта, вставляя try...except
блокирует каждое утверждение и проглатывая все исключения. Так что, возможно, вы могли бы попробовать подобную тактику?
Само собой разумеется: библиотека предназначена как шутка. Никогда не используйте его в производственном коде.
Вы упомянули, что ваш прецедент - это привязка ссылок на недостающие имена. Вы думали об использовании метапрограммирования для запуска своего кода в контексте "умного" пространства имен, такого как defaultdict
? (Это, пожалуй, чуть менее плохая идея, чем fuckit.py
.)
from collections import defaultdict
class NoMissingNamesMeta(type):
@classmethod
def __prepare__(meta, name, bases):
return defaultdict(lambda: "foo")
class MyClass(metaclass=NoMissingNamesMeta):
x = y + "bar" # y doesn't exist
>>> MyClass.x
'foobar'
NoMissingNamesMeta
представляет собой metaclass - конструкцию языка для настройки поведения оператора class
. Здесь мы используем метод __prepare__
для настройки словаря, который будет использоваться как пространство имен классов во время создания класса. Таким образом, поскольку мы используем defaultdict
вместо обычного словаря, класс, метакласс которого NoMissingNamesMeta
никогда не получит NameError
. Любые имена, упомянутые при создании класса, будут автоматически инициализированы до "foo"
.
Этот подход аналогичен идее @AndréFratelli о том, что вручную запрашивает лениво инициализированные данные из объекта Scope
. В производстве я бы сделал это, а не это. Версия метакласса требует меньше ввода текста для написания кода клиента, но за счет гораздо большего количества магии. (Представьте себе, что вы отлаживаете этот код через два года, пытаясь понять, почему несуществующие переменные динамически вносятся в сферу!)