Доберитесь list/tuple/dict аргументов передал функции?

Учитывая следующую функцию:

def foo(a, b, c):
    pass

То, как можно было бы получить list/tuple/dict/etc аргументов, передало в, не имея необходимость создавать структуру самостоятельно?

А именно, я ищу версию Python JavaScript arguments ключевое слово или PHP's func_get_args() метод.

То, что я не ищу, является использованием решения *args или **kwargs; Я должен указать имена аргумента в функциональном определении (чтобы гарантировать, что они передаются в), но в функции я хочу работать с ними в списке - или структура dict-стиля.

61
задан Phillip B Oldham 26 March 2010 в 08:39
поделиться

6 ответов

Вы можете использовать locals () , чтобы получить определение локальных переменных в вашей функции, например :

def foo(a, b, c):
    print locals()

>>> foo(1, 2, 3)
{'a': 1, 'c': 3, 'b': 2}

Это немного хакерское занятие, поскольку locals () возвращает все переменные в локальной области видимости, а не только аргументы, переданные функции, поэтому, если вы не вызовете ее сразу в верхней части функции результат может содержать больше информации, чем вы хотите:

def foo(a, b, c):
    x = 4
    y = 5
    print locals()

>>> foo(1, 2, 3)
{'y': 5, 'x': 4, 'c': 3, 'b': 2, 'a': 1}

Я бы предпочел создать словарь или список переменных, которые вам нужны, в верхней части вашей функции, как предлагается в других ответах. Он более явный и более четко передает намерение вашего кода, ИМХО.

79
ответ дан 24 November 2019 в 17:20
поделиться

Одно из решений с использованием декораторов - здесь .

1
ответ дан 24 November 2019 в 17:20
поделиться

Я бы использовал * args или ** kwargs и генерировал исключение, если аргументы не такие, как ожидалось

Если вы хотите получить те же ошибки, что и проверенные с помощью python вы можете сделать что-то вроде

def check_arguments(function_name,args,arg_names):
    missing_count = len(arg_names) - len(args)
    if missing_count > 0:
        if missing_count == 1:
            raise TypeError(function_name+"() missing 1 required positionnal argument: "+repr(arg_names[-1]))
        else:
            raise TypeError(function_name+"() missing "+str(missing_count)+" required positionnal argument: "+", ".join([repr(name) for name in arg_names][-missing_count:-1])+ " and "+repr(arg_names[-1]))

, используя что-то вроде

def f(*args):
    check_arguments("f",args,["a","b","c"])
    #whatever you want
    ...
4
ответ дан 24 November 2019 в 17:20
поделиться

Вы указали параметры в заголовке?

Почему бы вам просто не использовать ту же информацию в теле?

def foo(a, b, c):
   params = [a, b, c]

Что там Я пропустил?

1
ответ дан 24 November 2019 в 17:20
поделиться

Вы можете создать список из них, используя:

args = [a, b, c]

Вы можете легко создать кортеж из них, используя:

args = (a, b, c)
1
ответ дан 24 November 2019 в 17:20
поделиться

Вы можете использовать модуль inspect:

def foo(x):
    return x

inspect.getargspec(foo)
Out[23]: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

Это дубликат this и this.

7
ответ дан 24 November 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: