将函数参数打包到字典中 - 与** kwargs相反

时间:2015-03-26 08:03:08

标签: python arguments argument-passing

我试图做一些与** kwargs相反的事情,我不确定它是否可能。但是知道Python可能是:-) 我希望在我的方法中清楚地设计所有属性(用于自动完成,并且易于使用),我想抓住所有这些属性,比如说字典,然后继续传递。

class Foo(object):
   def __init__(self, a=1, b=2):
      inputs = grab_function_inputs_somehow()
      self.bar(**inputs)

   def bar(self, *args, **kwargs):
      pass

正常的做法是将每个输入分配到一个对象参数中,但我不想为所有类做到这一点。我希望有一种方法可以将它包装到一个可以继承的方法中。

2 个答案:

答案 0 :(得分:7)

您可以使用locals()使用变量进行dict。例如:

class Foo(object):
    def __init__(self, a=1, b=2):    
        inputs = locals()
        del inputs['self'] # remove self variable
        print(inputs)


f = Foo() 

打印结果:

{'b': 2, 'a': 1}

答案 1 :(得分:-1)

这是可能的,但需要对您的代码进行一些调整:

class Foo(object):
    def __init__(self, **inputs):
        # Have to set your defaults in here
        inputs['a'] = inputs.get('a', 1)
        inputs['b'] = inputs.get('b', 2)
        # Now the rest of your code, as you expected
        self.bar(**inputs)

    def bar(self, *args, **kwargs):
        print("bar got: %s" % kwargs)


# No arguments, use defaults
Foo()           # bar got: {'a': 1, 'b': 2}
# Arguments provided
Foo(a=3, b=4)   # bar got: {'a': 3, 'b': 4}

因此,不是在函数定义中提供默认参数,而是确保您期望的键存在,或者使用提供的参数,或者使用作为第二个参数传递给<dict>.get()的默认值。< / p>

修改 __init__也可以写成:

def __init__(self, **inputs):
    # Have to set your defaults in here
    if 'a' not in inputs: inputs['a'] = 1
    if 'b' not in inputs: inputs['b'] = 2
    # Now the rest of your code, as you expected
    self.bar(**inputs)

# or

def __init__(self, **inputs):
    # Have to set your defaults in here
    args = {'a': 1, 'b':2}
    args.update(inputs)
    # Now the rest of your code, as you expected
    self.bar(**args)

根据您拥有的默认参数的数量,最后一个选项可能是首选。