Учитывая следующую функцию:
def foo(a, b, c):
pass
То, как можно было бы получить list/tuple/dict/etc аргументов, передало в, не имея необходимость создавать структуру самостоятельно?
А именно, я ищу версию Python JavaScript arguments
ключевое слово или PHP's func_get_args()
метод.
То, что я не ищу, является использованием решения *args
или **kwargs
; Я должен указать имена аргумента в функциональном определении (чтобы гарантировать, что они передаются в), но в функции я хочу работать с ними в списке - или структура dict-стиля.
Вы можете использовать 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}
Я бы предпочел создать словарь или список переменных, которые вам нужны, в верхней части вашей функции, как предлагается в других ответах. Он более явный и более четко передает намерение вашего кода, ИМХО.
Одно из решений с использованием декораторов - здесь .
Я бы использовал * 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
...
Вы указали параметры в заголовке?
Почему бы вам просто не использовать ту же информацию в теле?
def foo(a, b, c):
params = [a, b, c]
Что там Я пропустил?
Вы можете создать список из них, используя:
args = [a, b, c]
Вы можете легко создать кортеж из них, используя:
args = (a, b, c)
Вы можете использовать модуль inspect:
def foo(x):
return x
inspect.getargspec(foo)
Out[23]: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)