Согласно Модель данных Python :
__defaults__
Кортеж, содержащий значения аргументов по умолчанию для тех аргументов, которые имеют значения по умолчанию, или Нет, если ни один аргумент не имеет значения по умолчанию
>>> def foo(a=[]):
... a.append(1)
...
... foo()
... foo.__defaults__
([1],)
Существует также __kwdefaults__
для аргументов только для ключевых слов.
>>> def foo(a=1, *, b=2):
... pass
...
... foo.__defaults__, foo.__kwdefaults__
((1,), {'b': 2})
Обратите внимание, что вещи в Python не обязательно хранятся в любом месте доступны.Например, счетчик ссылок объекта недоступен как атрибут.Он существует только в слое C реализации CPython и требует встроенной магии для доступа.
На самом деле __defaults__
также не является "настоящим" атрибутом,Это встроенное свойство, извлекающее значения по умолчанию, где бы ни находилась реализация.
# python3
>>> type(foo).__defaults__
<attribute '__defaults__' of 'function' objects>
# pypy3
>>>> type(foo).__defaults__
<getset_descriptor object at 0x00000001110adc98>