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

relay multiple keyword arguments from outer function to inner functions in Python?

我正在尝试将参数传递给外部函数,然后将它们传递给一个或多个内部函数。我最接近实现此目标的时间:

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})

这种形式的东西也很棒。

这不是很漂亮的代码,但我认为它可以满足您的需求,对吗?

    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)

好的,我知道如何离线执行此操作了。至少有两种方法。

第一种方式:随处拍打 **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 集并以字典形式传递它们(我的首选)

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() 参数之前指定。

这些答案对我帮助不大,但我一直在寻找其他东西。既然我已经弄清楚了,我想我可能会 post 这里的答案,对于那些可能会像我一样到达这里的人。

在我的例子中,我想要一个将我的内部函数作为参数的外部函数,而我的内部函数会有其他参数,但内部函数及其参数每次都可能不同。

当然我找到的解决方案很简单,可能每个人都知道。

所以我的外部函数乘以内部函数的一次执行并打印出 漂亮 输出:

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