我试图做一些与** 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
正常的做法是将每个输入分配到一个对象参数中,但我不想为所有类做到这一点。我希望有一种方法可以将它包装到一个可以继承的方法中。
答案 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)
根据您拥有的默认参数的数量,最后一个选项可能是首选。