Знаете ли вы про "магические" методы классов ˍˍgetattributeˍˍ() и ˍˍgetattrˍˍ()?
ˍˍgetattributeˍˍ вызывается всякий раз когда идёт обращение к атрибуту объекта. Например метод или какая-то переменная.
ˍˍgetattrˍˍ вызывается когда атрибут не найден.
И вот тут-то начинается самое интересное. Вы можете написать алгоритм определения динамического атрибута. Вы получаете его имя и можете решить, что вернуть учитывая запрошенное имя. Например, можете сделать запрос в базу данных или просто вернуть значение по умолчанию.
Но пост на самом деле не об этом. Дело в том, что в Python 3.7 добавили возможность определять функцию ˍˍgetattrˍˍ() в модуле с аналогичной функциональностью! (PEP562)
То есть, создав внутри модуля функцию ˍˍgetattrˍˍ() мы определяем действие в случае запроса несуществующего атрибута модуля. Ровно так же как это делаем в классах. Тем самым можно динамически определять состав модуля.
А еще можно создать функцию ˍˍdirˍˍ(), определяющую поведение для стандартной функции dir().
Пример модуля:
# example.py
my_variables = {'var1': 1, "var2": 2}
def __getattr__(name):
try:
return my_variables[name]
except KeyError:
raise AttributeError
def __dir__():
return list(my_variables.keys())
Как использовать модуль
>>> import example
>>> print(example.var1)
1
>>> print(example.var3)
AttributeError
>>> print(dir(example)))
['var1', 'var2']
#tricks#pep