У объектов функций есть специальный атрибут __dict__
. Это словарь атрибутов функции. В него можно устанавливать и получать какие-то значения с помощью точечной нотации.
Доступ к словарю атрибутов функции можно получить как из тела функции, так и из вне:
def func(): func.a = 10 >>> func.__dict__ # {} >>> func() >>> func.__dict__ # {'a': 10} >>> func.a # 10 >>> func.a = 25 >>> func.a # 25 >>> func.x = 6 >>> func.x # 6 >>> func.list = [] >>> func.list.append(10) >>> func.list.append(1) >>> func.list.append(5) >>> func.list # [10, 1, 5] >>> func.__dict__ # {'a': 25, 'x': 6, 'list': [10, 1, 5]}
Удаление словаря атрибутов функции __dict__
или его настройка ни к чему не приведет. Если никакие атрибуты функции никогда не устанавливались, то словарь атрибутов функции __dict__
будет пустой.
Словарь атрибутов может быть использован для кеширования промежуточных значений декоратора или для кэширования уже вычисленных значений функции. Например это может быть атрибут функции func.cash
, который будет хранить словарь, у которого в качестве ключа будет кортеж входных параметров функции, а значение словаря - возвращаемый результат функции.
Атрибуты функции могут использоваться для записи облегченных замыканий, которые объединяют код и связанные данные.
def func(i): func.a += i return func.a >>> func.a = 1 >>> func(5) # 6 >>> func(5) # 11 >>> func(5) # 16
Атрибуты иногда используются как статические переменные для функции.
def a(): pass a.publish = 1 a.unittest = '''...''' if a.publish: print a() if hasattr(a, 'unittest'): testframework.execute(a.unittest)