我想知道是否有一种方法可以在不知道可用参数的情况下将值传递给函数的所有参数?
例子:
def SomeFunction(arg1, arg2, arg3):
print(arg1)
print(arg2)
print(arg3)
SomeFunction("Hi"**)
>> Hi
>> Hi
>> Hi
Run Code Online (Sandbox Code Playgroud)
在**这种情况下仅仅是占位符语法。
我永远不会让这通过代码审查,但为了好玩,为什么不呢?
import inspect
SomeFunction(*["Hi"] * len(inspect.signature(SomeFunction).parameters))
Run Code Online (Sandbox Code Playgroud)
它是如何工作的?让我们分解一下。
您可以使用func(*l)将列表解包为单独的参数,如下所示:
>>> SomeFunction(*['Hi', 'Hi', 'Hi'])
Hi
Hi
Hi
Run Code Online (Sandbox Code Playgroud)
将一个列表乘以一个数字会将该列表复制多次。
>>> ["Hi"] * 3
['Hi', 'Hi', 'Hi']
>>> SomeFunction(*['Hi'] * 3)
Hi
Hi
Hi
Run Code Online (Sandbox Code Playgroud)
3我们如何获得参数的数量而不是硬编码?答:检查模块。
>>> inspect.signature(SomeFunction)
<Signature (arg1, arg2, arg3)>
>>> inspect.signature(SomeFunction).parameters
mappingproxy(OrderedDict([('arg1', <Parameter "arg1">), ('arg2', <Parameter "arg2">), ('arg3', <Parameter "arg3">)]))
>>> len(inspect.signature(SomeFunction).parameters)
3
Run Code Online (Sandbox Code Playgroud)
将它们放在一起:
>>> ["Hi"] * len(inspect.signature(SomeFunction).parameters)
['Hi', 'Hi', 'Hi']
>>> SomeFunction(*["Hi"] * len(inspect.signature(SomeFunction).parameters))
Hi
Hi
Hi
Run Code Online (Sandbox Code Playgroud)