在Python中将多个关键字参数从外部函数转发到内部函数?

时间:2018-03-04 20:07:59

标签: python function inheritance args kwargs

我试图将参数传递给外部函数,然后将它们中继到一个或多个内部函数。我最接近实现这个目标:

def multiply(number, factor=1):
    return number*factor

def add(number, to_add=0):
    return number+to_add

def multiply_add(number, *args):
    return add(multiply(number, *args[0]), *args[1])

multiply_add(5, [3], [200])
Out[]: 215

这种解决方案在某些方面是不切实际的:1)用户必须知道传递参数的顺序,而不使用关键字; 2)这些参数由于某种原因必须是迭代的,否则得"TypeError: multiply() argument after * must be an iterable, not int"

我的问题:如何重写multiply_add()以便以下工作? :

multiply_add(5, factor=3, to_add=200)

P.S。我已经看到了一个有效的例子,Seaborn调用了额外的Matplotlib参数。例如,使点大小等于25:

sns.jointplot(x='A', y='B', data=df, kind='reg', scatter_kws={'s': 25})

这种形式的东西也会很棒。

3 个答案:

答案 0 :(得分:0)

这不是很漂亮的代码,但我认为它能做到你想要的吗?

    1 def multiply(number, factor=1.0):
    2     return number*factor
    3 
    4 def add(number, to_add=0):
    5     return number+to_add
    6 
    7 def multiply_add(number, **kwargs):
    8     factor = kwargs.get("factor")
    9     to_add = kwargs.get("to_add")
   11     if to_add and factor:
   12         return add(multiply(number, factor), to_add)
   13     elif to_add:
   14         return add(multiply(number), to_add)
   15     elif factor:
   16         return add(multiply(number, factor))

也许你更喜欢:

  1 def multiply(number, factor=1.0):
  2     if factor == None:
  3         factor=1.0
  4     return number*factor
  5 
  6 def add(number, to_add=0):
  7     if to_add == None:
  8        to_add=0
  9     return number+to_add
 10 
 11 def multiply_add(number, **kwargs):
 12     factor = kwargs.get("factor")
 13     to_add = kwargs.get("to_add")
 14     return add(multiply(number, factor), to_add)
 15 print multiply_add(30)
 16 print multiply_add(30, to_add=2)
 17 print multiply_add(30, to_add=25)
 18 print multiply_add(30, factor=8)
 19 print multiply_add(30, factor=2, to_add=6)

答案 1 :(得分:0)

好的,我想出了如何离线完成此操作。至少有两种方式。

第一种方式:绝对打击**kwargs

def multiply(number, factor=1, **kwargs):
    return number*factor

def add(number, to_add=0, **kwargs):
    return number+to_add

def multiply_add(number, **kwargs):
    return add(multiply(number, **kwargs), **kwargs)

multiply_add(5, to_add=200, factor=3)

请注意,参数顺序在这里无关紧要。

第二种方式:指定不同的**kwargs集并以dict格式传递(我的首选)

def multiply(number, factor=1):
    return number*factor

def add(number, to_add=0):
    return number+to_add

def multiply_add(number, kwargs_multiply, kwargs_add):
    return add(multiply(number, **kwargs_multiply), **kwargs_add)

multiply_add(5, {'factor':3}, {'to_add':200})

请注意,参数顺序在这里很重要:multiply()参数需要在add()参数之前指定。

答案 2 :(得分:0)

这些答案对我没有多大帮助,但无论如何我还是在寻找其他东西。既然我已经弄清楚了,我想我可以在这里发布答案,以供那些可能以与我相同的方式到达这里的人。

在我的情况下,我想要一个外部函数,该函数将内部函数作为参数,而内部函数将具有其他参数,但是内部函数及其参数可能每次都不同。

授予我发现的解决方案非常简单,也许每个人都知道。

因此我的外部函数对内部函数的一次执行进行计时,并打印出 pretty 输出:

def timeFun(function):
  t_start = perf_counter()
  print("---\nResult: ", function, "\nExecution time: ", perf_counter() - t_start, sep="")

现在为了简单起见,我的内部功能是如此,以至于没有时间了:

def sumTogether(*args):
  return sum(args)

现在您只需像这样调用函数:

timeFun(sumTogether(1, 2, 3, 4))

输出为:

---     
Result: 10
Execution time: 7.99999999995249e-07

也:

def time(function):
  t_start = perf_counter()
  print("---\nResult: ", function, "\nExecution time: ", perf_counter() - t_start, sep="")

def sumTogether(*args, just_for_kicks=5):
  return sum(args) + just_for_kicks

time(sumTogether(1, 2, 3, 4, just_for_kicks=10))

输出:

---     
Result: 20
Execution time: 8.999999999981245e-07