Где живет изменяемый объектный аргумент функции?Есть ли таблица символов?(Учебник по Python 4.7.1) - PullRequest
0 голосов
/ 19 сентября 2018

В учебнике по питону , в разделе 4.7.1 , изменяемый аргумент по умолчанию хранится где-то, но я не могу найти его, используя dir(), globals(), locals() илиf.__dict__.Я имею в виду этот код:

def f(a, L=[]):
    L.append(a)
    return L

ведет себя так:

>>> print(f(1))
[1]
>>> print(f(2))
[1, 2]
>>> print(f(3))
[1, 2, 3]

Я бы ожидал увидеть это в пространстве имен функции, скажем, когда я сделаю dir(f), ноего там нет.

Я посмотрел на это , но это гораздо больше, чем я, вероятно, ищу.

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Если вы используете Spyder, при вводе f. должны появиться параметры автозаполнения.Один из них - __defaults__, который содержит значения по умолчанию.

0 голосов
/ 19 сентября 2018

Согласно Модель данных 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>
0 голосов
/ 19 сентября 2018

Это в f.__defaults__:

>>> def f(a, L=[]):
...     L.append(a)
...     return L
...
>>> f.__defaults__
([],)

Вы не нашли __defaults__ в __dict__, потому что он не хранится в __dict__;он хранится в выделенном элементе структуры уровня C , который сопоставляется атрибуту __defaults__ дескриптором типа функции.

...