问题描述
在 Python 中编写一个函数的正确方法是什么,该函数将返回它在运行时收到的完全相同的参数?
例如:
def pass_thru(*args,**kwargs):
# do something non-destructive with *args & **kwargs
return ??? <- somehow return *args & **kwargs
解决方法
考虑以下函数:
def a(*args,**kwargs):
return args,kwargs
当我们调用函数时,返回的值是一个元组,首先包含另一个带有参数的元组,然后是一个带有关键字参数的字典:
b = a(1,2,3,a='foo')
print(b)
输出:((1,3),{'a': 'foo'})
print(b[0]) # Gives the args as a tuple
print(b[1]) # Gives the kwargs as a dictionary
,
问题在于您的参数只是一系列值,而不是您可以操作的值本身。关键字参数本身不是一等值(即 a=3
不是值);它们纯粹是一种句法结构。
*
和 **
参数让你成功了:
def pass_thru(*args,**kwargs):
return *args,kwargs
然后
>>> pass_thru(1,a=3)
(1,{'a': 3})
但是你不能简单地把它传回 pass_thru
;你会得到不同的结果。
>>> pass_thru(pass_thru(1,a=3))
((1,{'a': 3}),{})
您可以尝试解包元组:
>>> pass_thru(*pass_thru(1,a=3))
(1,{'a': 3},{})
但你真正需要的是解压字典。类似的东西
>>> *a,kw = pass_thru(1,a=3)
>>> pass_thru(*a,**kw)
(1,{'a': 3})
据我所知,没有办法将最后一个例子组合成一个单一的、嵌套的函数调用。