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

Pack function arguments into a dictionary - opposite to **kwargs

我正在尝试做一些与 **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

通常的做法是将每个输入分配给一个对象参数,但我不想对所有输入都这样做 类。我希望有一种方法可以将它包装成可以继承的方法。

这是可能的,但需要对您的代码稍作调整:

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() 的默认值.

编辑 __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)

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

您可以使用 locals() 创建带有变量的字典。例如:

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}