如何干净地传递关键字args?

时间:2017-12-08 20:31:35

标签: python python-2.7 kwargs

当编写调用其他子函数的函数时,我经常希望允许调用者为这些子函数传递任意关键字参数。但是,我实现这一点的当前方式是混乱的,我正在寻找一种更清晰,简洁,可维护的方式。

以下是我目前如何实现此目标的示例:

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的默认参数。

2 个答案:

答案 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')