Используя изменяемый аргумент по умолчанию, как получить доступ к объекту вне функции? - PullRequest
0 голосов
/ 23 февраля 2020

Если у меня есть что-то вроде этого:

def f(x, cache=[]):
    cache.append(x)

Как я могу получить доступ к cache извне f?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2020

Вы можете использовать __defaults__ волхвы c:

>>> def f(x, cache=[]):
...     cache.append(x)
>>> f.__defaults__
([],)
>>> f(2)
>>> f.__defaults__
([2],)
>>> f('a')
>>> f.__defaults__
([2, 'a'],)
>>> c, = f.__defaults__
>>> c
[2, 'a']

Просто для полноты можно использовать inspect.getfullargspec, что более явно:

>>> import inspect
>>> inspect.getfullargspec(f)
FullArgSpec(args=['x', 'cache'], varargs=None, varkw=None, defaults=([2, 'a'],), kwonlyargs=[], kwonlydefaults=None, annotations={})
>>> inspect.getfullargspec(f).defaults
([2, 'a'],)
1 голос
/ 23 февраля 2020

Переменные внутри области действия функции не предназначены для доступа извне.

Что вам нужно сделать, это использовать глобальную переменную для хранения вашего кэша:

GLOBAL_CACHE = []

def f(x, cache=GLOBAL_CACHE):
    cache.append(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...