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