将函数参数打包到字典中——与 **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}
我正在尝试做一些与 **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}