例如,我有一个函数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]
答案 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))