如何将其他参数(除了参数)传递给Python中的函数

时间:2013-06-07 12:13:31

标签: python function arguments

我需要编写一个有一个参数的函数(比如fun1),因为它将用于其他函数(fun2)。后者需要一个带有单个参数的函数。但是,我需要将其他参数传递给函数fun1。如何在不使用全局变量的情况下在Python中执行此操作?或者这是唯一的方法?

添加:如果重要,fun2是来自scipy.optimize的一些优化功能。以下是使用c将其他参数fun1传递给函数global的示例。在第一个调用中,函数fun2fun1作为x+1,但在第二个调用中,fun1x+2。我想做类似的,但不使用global。希望这个例子澄清了这个问题。 (示例已更改)。

def fun1(x) :
   global c
   return  x + c

def fun2(f1, x) :
   return  f1(x)

# main program
global c
x0= 1  
c= 1;   y= fun2(fun1, x0);  print(y)    # gives 2
c= 2;   y= fun2(fun1, x0);  print(y)    # gives 3

5 个答案:

答案 0 :(得分:3)

如果我理解你的问题,有很多方法可以做你想做的事情并避免使用全局变量。他们来了。

假设:

x0 = 1
def fun2(f1, x):
    return f1(x)

所有这些技巧都可以实现您的目标:

#### #0 -- function attributes
def fun1(x):
    return x + fun1.c

fun1.c = 1;  y = fun2(fun1, x0);   print(y)   # --> 2
fun1.c = 2;  y = fun2(fun1, x0);   print(y)   # --> 3

#### #1 -- closure
def fun1(c):
    def wrapper(x):
        return x + c
    return wrapper

y = fun2(fun1(c=1), x0);   print(y)   # --> 2
y = fun2(fun1(c=2), x0);   print(y)   # --> 3

#### #2 -- functools.partial object
from functools import partial

def fun1(x, c):
    return x + c

y = fun2(partial(fun1, c=1), x0);   print(y)   # --> 2
y = fun2(partial(fun1, c=2), x0);   print(y)   # --> 3

#### #3 -- function object (functor)
class Fun1(object):
    def __init__(self, c):
        self.c = c
    def __call__(self, x):
        return x + self.c

y = fun2(Fun1(c=1), x0);   print(y)   # --> 2
y = fun2(Fun1(c=2), x0);   print(y)   # --> 3

#### #4 -- function decorator
def fun1(x, c):
    return x + c

def decorate(c):
    def wrapper(f):
        def wrapped(x):
            return f(x, c)
        return wrapped
    return wrapper

y = fun2(decorate(c=1)(fun1), x0);   print(y)   # --> 2
y = fun2(decorate(c=2)(fun1), x0);   print(y)   # --> 3

请注意,在调用中并不总是严格要求编写c=参数 - 我只是将它放在所有用法示例中以保持一致性,因为它使得传递它的方式更加清晰。

答案 1 :(得分:2)

即使没有其他参数也可以调用该函数的事实表明它们是可选的并且具有一些默认值。所以你应该使用默认参数

def fun1(foo, bar='baz'):
    # do something

这样您就可以调用函数fun1('hi'),而bar将默认为'baz'。您也可以将其称为fun1('hi', 15)

如果他们没有任何合理的默认值,您可以使用None作为默认值。

def fun1(foo, bar=None):
    if bar is None:
        # `bar` argument was not provided
    else:
        # it was provided

答案 2 :(得分:2)

您正在寻找的是课堂上的一种方法。

使用方法fun1和实例变量c定义一个类。可以使用.表示法从任何地方访问它:

class A:
    def fun1(self, x):
        return x + self.c

让我们定义fun2,例如:

def fun2(f, p):
    return f(p)

我们现在可以像使用全局变量a.c一样使用c

>>> a = A() # create an instance and initialize it
>>>         # "self.c" is undefined yet
>>>
>>> a.c = 1 # "self.c" will be 1
>>> fun2(a.fun1, 1)
2
>>> a.c = 2 # now "self.c" will be 2
>>> fun2(a.fun1, 1) # same arguments, different result
3

Here您可以了解有关课程的更多信息。

答案 3 :(得分:1)

只需使用默认值添加额外参数:

def fun1(param1, param2=None, param3=None):
    ...

然后你可以这样从fun1致电fun2

def fun2():
    something = fun1(42)

从其他地方你可以这样称呼它:

fun1(42, param2=60)

答案 4 :(得分:0)

你可以使用装饰器来传递它 装饰者:

def jwt_or_redirect(fn):
  @wraps(fn)
  def decorator(*args, **kwargs):
    ...
    return fn(*args, **kwargs)
  return decorator

def jwt_refresh(fn):
  @wraps(fn)
  def decorator(*args, **kwargs):
    ...
    new_kwargs = {'refreshed_jwt': 'xxxxx-xxxxxx'}
    new_kwargs.update(kwargs)
    return fn(*args, **new_kwargs)
  return decorator

和最终函数:

@jwt_or_redirect
@jwt_refresh
def home_page(*args, **kwargs):
  return kwargs['refreched_jwt']