2015-02-06 3 views
2

Я знаю, что есть много вопросов/ответов на * arg, ** kwarg. Тем не менее, я делаю что-то немного назад и не мог найти его имя (возможно, я просто не знаю, как задать вопрос.) Во всяком случае, я хочу, чтобы упростить ниже:Получить параметры функции в качестве словаря

def foo(self, arg1, arg2, arg3): 
    my_dict = dict(arg1=arg1, arg2=arg2, arg3=arg2) 
    my_str = "{arg1} went up the {arg2} hill to fetch a pail of {arg3}". 
       format(**my_dict) 

сведению, Я не мог бы определить foo как (self, ** kwargs), поскольку мне нравится компонент автозаполнения для заполнения функции.

Спасибо,

+0

Так ты хотите создать словарь из некоторых параметров? – nbro

+2

может использоваться '** locals()'? – mshsayem

+0

@mshsayem - как насчет того, чтобы написать это как ответ? – tdelaney

ответ

3

Параметры в локальном пространстве имен Словаре, поэтому использовать его:

def foo(self, arg1, arg2, arg3): 
    my_str = "{arg1} went up the {arg2} hill to fetch a pail of {arg3}". 
       format(**locals()) 
+0

Работал, как шарм, спасибо. – SteveJ

1

inspect является то, что вы ищете:

import inspect 

class T(object): 
    def foo(self, arg1, arg2, arg3): 
     frame = inspect.currentframe() 
     args, _, _, values = inspect.getargvalues(frame) 
     my_dict = {arg: values[arg] for arg in args if arg != 'self'} 
     my_str = "{arg1} went up the {arg2} hill to fetch a pail of {arg3}".format(**my_dict) 
     print my_dict 
     print my_str 

z = T() 
z.foo(3,4,5) 

arg != 'self' записной часть, как это вызов метода. Если у вас есть функция с параметром self, это не отображает этот параметр.

+0

Насколько я знаю, есть ли причина, по которой вы выбрали проверку против locals()? Есть ли преимущество или ловушка, о которых я должен знать. – SteveJ

+0

@SteveJ Не совсем. Единственное отличие состоит в том, что местные жители будут хранить и другие локальные переменные. То есть вы должны вызвать местных жителей в самом начале функции. – dmg

0

Как @dmg упоминалось вы можете использовать inspect:

import inspect 

def find_args(f): 
    return inspect.getargspec(f)[0] 

def foo(arg1, arg2, arg3): 
    my_args = find_args(foo) 
    my_dict = { k: v for k,v in zip(my_args, [arg1, arg2, arg3])} 
    my_str = "{arg1} went up the {arg2} hill to fetch a pail of {arg3}".format(**my_dict) 
    print my_str 

foo('a','b', 'c') 

Вернется

a went up the b hill to fetch a pail of c 
Смежные вопросы