我试图将参数传递给外部函数,然后将它们中继到一个或多个内部函数。我最接近实现这个目标:
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})
这种形式的东西也会很棒。
答案 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