如果编写函数在您的范围内,那么让您的函数接受任意数量的关键字参数,并检查函数中感兴趣的参数。
class MissingArgumentError(ValueError):
pass
def f(**kwargs):
if not 'foo' in kwargs:
raise MissingArgumentError('Missing keyword argument `foo`')
return kwargs['foo']
def g(**kwargs):
if not 'bar' in kwargs:
raise MissingArgumentError('Missing keyword argument `bar`')
return 10 * kwargs['bar']
在这种方法中,即使您的函数签名发生了更改,也不需要更改任何其他内容。
如果您必须编写多个这样的函数,那么您可以使用
decorators
.
def argverifier(compulsory_args:list):
def actual_decorator(function):
def inner(**kwargs):
for arg in compulsory_args:
if arg not in kwargs:
raise MissingArgumentError(f'Missing keyword argument : {arg}')
return function(**kwargs)
return inner
return actual_decorator
@argverifier(compulsory_args=['foo'])
def f(**kwargs): return kwargs['foo']
@argverifier(compulsory_args=['bar'])
def g(**kwargs): return 10 * kwargs['bar']
如果您不希望更改函数的签名,那么可行的解决方案是编写一个函数,使用
inspect
按照你的建议。
from functools import partial
import inspect
def f(foo): return foo
def g(bar): return 10 * bar
def argextractor(args, kwargs):
return {k:v for k, v in kwargs.items() if k in args}
f_argextractor = partial(argextractor, inspect.getfullargspec(f).args)
g_argextractor = partial(argextractor, inspect.getfullargspec(g).args)
f(**f_argextractor(vars(ns3)))
g(**g_argextractor(vars(ns3)))