Python 如何知道要传递给引用函数的参数数

Python 如何知道要传递给引用函数的参数数,python,python-3.x,function,reference,arguments,Python,Python 3.x,Function,Reference,Arguments,假设a I有两个函数: def foo1(bar, a, b, c): result = bar(a, b) return result def foo2(bar, a, b, c): result = bar(a, b, c) return result 参数在两种情况下都是相同的,但它取决于功能栏,该功能栏可能只需要2个,而另一个功能栏可能需要相同顺序的全部3个 是否可以在不知道引用函数需要多少参数的情况下将其转换为单个函数?我想您可能正在寻找*扩展运算符 def foo

假设a I有两个函数:

def foo1(bar, a, b, c):
  result = bar(a, b)
  return result

def foo2(bar, a, b, c):
  result = bar(a, b, c)
  return result
参数在两种情况下都是相同的,但它取决于功能栏,该功能栏可能只需要2个,而另一个功能栏可能需要相同顺序的全部3个


是否可以在不知道引用函数需要多少参数的情况下将其转换为单个函数?

我想您可能正在寻找*扩展运算符

def foo(bar, *args):
  result = bar(*args)
  return result
例如:

In [1]: def foo(bar,*args): 
   ...:     return bar(*args) 
   ...:                                                                                                                                      

In [2]: def f1(a): 
   ...:     return a 
   ...:                                                                                                                                      

In [3]: def f2(a,b): 
   ...:     return a+b 
   ...:                                                                                                                                      

In [4]: foo(f1,5)                                                                                                                            
Out[4]: 5

In [5]: foo(f2,5,6)                                                                                                                          
Out[5]: 11

In [6]: foo(f1,5,6)                                                                                                                          
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-5ca26cac7f4d> in <module>
----> 1 foo(f1,5,6)

<ipython-input-1-fe8d4699f744> in foo(bar, *args)
      1 def foo(bar,*args):
----> 2     return bar(*args)
      3 

TypeError: f1() takes 1 positional argument but 2 were given

对。如果我理解正确,您想向函数传递未指定数量的参数吗

如果是这样,您可以接受一个元组;这样函数就可以接受a、b、c或多个参数。元组类似于列表,但不可变。当然,这取决于你是否输入了正确数量的参数

arguments=(bar, a, b)
foo(arguments)

def foo(my_tuple):
  result = arguments[0](arguments[1], arguments[2])
  return result
下面,参数是一个元组。 您可以使用参数来确定输入了多少个参数

arguments=(bar, a, b)
foo(arguments)

def foo(my_tuple):
  result = arguments[0](arguments[1], arguments[2])
  return result

您可以使用函数对象的_code__.co_argcount属性来获取所需的参数数量,使用该数量可以分割参数列表:

def bar1(a, b):
    return b, a

def bar2(a, b, c):
    return c, b, a

def foo(bar, *args):
    return bar(*args[:bar.__code__.co_argcount])

print(foo(bar1, 1, 2, 3))
print(foo(bar2, 1, 2, 3))
这将产生:

(2, 1)
(3, 2, 1)
试试这个

from inspect import signature

def foo(bar, *args):
    arg_count = len(signature(bar).parameters)
    return bar(*args[:arg_count])

这将传递函数期望的参数数量,并忽略其余参数。如果以后要使用所有参数,它们都在args列表中。

是否要将所有提供的参数传递到函数中?或者不使用额外参数?另一个选项的可能重复是使用try:bara,b,c,除了TypeError:bara,bI不想传递所有参数。try/except会起作用,但还有其他方法吗?@dimakal在我链接的副本上有许多方法。不幸的是,OP在评论中澄清了他们不想传递所有参数。哪种方法更pythonic/更快?code.co_argcount还是签名?因为我不需要导入任何东西,所以我认为这是一个更好的解决方案?