当编写调用其他子函数的函数时,我经常希望允许调用者为这些子函数传递任意关键字参数。但是,我实现这一点的当前方式是混乱的,我正在寻找一种更清晰,简洁,可维护的方式。
以下是我目前如何实现此目标的示例:
data[:html] = render 'mails/sendemailbasedontime',:locals => { :data => localdata }
这种方法容易出错,我需要实现我想要表达的每一个kwarg。我有时可以使用def foo(a, print_line="Hello World!"):
print a, print_line
def bar(a, number=2, multiple=4):
print a, number * multiple
def baz(a, **kwargs):
if "print_line" in kwargs:
foo(a, print_line=kwargs["print_line"])
else:
foo(a)
bar_kwargs = dict()
if "number" in kwargs:
bar_kwargs["number"] = kwargs["number"]
if "multiple" in kwargs:
bar_kwargs["multiple"] = kwargs["multiple"]
bar(a, **bar_kwargs)
,但我想保留kwarg的默认参数。
答案 0 :(得分:1)
简单。只需将kwargs本身传递给子函数,并将kwargs变量添加到子函数
def foo(a, print_line="Hello World!", **kwargs):
print a, print_line
def bar(a, number=2, multiple=4, **kwargs):
print a, number * multiple
def baz(a, **kwargs):
foo(a, **kwargs)
bar(a, **kwargs)
这是有效的,因为现在子函数可以接收任意数量的关键字参数,同时具体定义它们需要具有的参数。因此,看起来像{'print_line':'test_line', 'number':1,'multiple':2}
的kwarg dict将完全适用于这两个函数。
根据评论的要求:
class SomeoneElsesClass:
def someone_elses_function(self, a, foo="bar"):
print(foo)
class MyClass(SomeoneElsesClass):
def someone_elses_function(self, a, foo="bar2", **kwargs):
super(MyClass, self).someone_elses_function(a, foo)
答案 1 :(得分:0)
不要为main函数中的每个子函数处理关键字参数,而是让子函数自己处理该逻辑。这样您就可以在程序中清楚separate each concern。
def foo(a, **kwargs):
print a, kwargs.get('print_line', 'Hello World')
def bar(a, number=2, multiple=4):
print a, kwargs.get('number', 2) * kwargs.get('multiple', 4)
def baz(a, **kwargs):
foo(a, **kwargs)
bar(a, **kwargs)
然后你会像这样调用baz
,如果你想让关键字参数的值与默认值不同,只需要传递特定的关键字参数值:
baz('a', print_line='Hello World', number=2, multiple=4)
# or...
baz('a', number=2, multiple=4)
# or...
baz('a', print_line='Hello World')
# or...
baz('a')