Доступ к словарю атрибутов функции можно получить как из тела функции, так и из вне:
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)