仅在需要时传递参数

时间:2018-07-17 14:02:31

标签: python python-3.x functional-programming

例如,我有一个函数a=1和一个变量f。 有时a需要f(a=a),而我想打电话给f,而其他时候f(a=a)没有参数。我该如何处理?

当我尝试调用a时(期望它会默默地忽略f中未使用f got an unexpected keyword argument 'a' 的情况),我收到以下TypeError:

g

修改

我想实现一个函数def f1(a): return a def f2(): return 1 ,使得:

g(f1, a) == a
g(f2, a) == 1

我们有:

  c[1]>u[,1]

3 个答案:

答案 0 :(得分:2)

f中使用关键字词典:

def f(**kwargs):
    if 'a' in kwargs:
        print("a passed with value {}".format(kwargs['a']))
    else:
        print('a not passed')

f(a=12)
f()

打印:

a passed with value 12
a not passed

它使参数测试/检索完全手动。您可以做任何您想做的事,并且可以将其推广为几个参数。

这也禁止传递像f(12)这样的位置参数,这对您来说可能是一件好事。

>>> f(12)
Traceback (most recent call last):
TypeError: f() takes 0 positional arguments but 1 was given

缺点是调用者无法依靠参数名称来知道要传递的内容。创建文档字符串,否则人们将不得不阅读代码/猜测...

现在将其应用于您的编辑,我必须要说的是哪种更改。因此f2无法更改,因为必须在包装函数中完成工作:

def f1(a):
    return a
def f2():
    return 1

def g(f,arg):
    try:
        return f(a=arg)
    except TypeError:
        return f()

a=12
print(g(f1, a))
print(g(f2, a))

打印:

12
1

因此“最好是宽恕而不是允许”:如果我们得到TypeError(当函数不知道参数时引发),我们只需调用函数 without 。缺点是,如果第一个函数返回一个TypeError,我们将无法知道它是参数还是函数内部。

一种解决方法是检查错误消息,并且仅在错误消息与参数有关时才调用不带参数的函数:

def g(f,arg):
    try:
        return f(a=arg)
    except TypeError as e:
        if "unexpected keyword" in str(e):
            return f()
        else:
            raise e  # another TypeError, let it pass

答案 1 :(得分:2)

似乎您想检查函数的参数。

为此,请使用inspect模块:

import inspect
def g(somefunc, *params):
    num_args = len(inspect.getargspec(somefunc).args)
    return somefunc(*params[:num_args])

使用您的功能进行测试:

def f1(a):
    return a

def f2():
    return 1

>>> print(g(f1, 3))
3
>>> print(g(f2, 3))
1

答案 2 :(得分:-1)

只需在函数def行中指定默认参数...

def f(a=1):
    return(a)
print(f()) #returns 1
print(f(a = 2)) #returns 2

接下来的部分(您似乎已经通过修改切换了问题...

def g(f, a):
    return(f(a))