我有一个字典,我需要将键/值作为关键字参数传递..例如。
d_args = {'kw1': 'value1', 'kw2': 'value2'} example(**d_args)
这可以正常工作, 但是 如果d_args字典中有一些example函数不接受的值,则它显然会消失。.说,如果将示例函数定义为def example(kw2):
example
def example(kw2):
这是一个问题,因为我无法控制d_args或example函数的生成。它们都来自外部模块,并且example仅接受dict中的某些关键字参数。
d_args
理想情况下,我会做
parsed_kwargs = feedparser.parse(the_url) valid_kwargs = get_valid_kwargs(parsed_kwargs, valid_for = PyRSS2Gen.RSS2) PyRSS2Gen.RSS2(**valid_kwargs)
我可能只是从有效的关键字参数列表中过滤出dict,但我想知道: 是否有一种方法可以以编程方式列出特定函数所采用的关键字参数?
比起直接检查代码对象并计算变量要好一些,那就是使用inspect模块。
>>> import inspect >>> def func(a,b,c=42, *args, **kwargs): pass >>> inspect.getargspec(func) (['a', 'b', 'c'], 'args', 'kwargs', (42,))
如果您想知道它是否可以与一组特定的args一起调用,则需要未指定默认值的args。这些可以通过以下方式获得:
def getRequiredArgs(func): args, varargs, varkw, defaults = inspect.getargspec(func) if defaults: args = args[:-len(defaults)] return args # *args and **kwargs are not required, so ignore them.
然后一个函数来告诉您特定字典缺少什么:
def missingArgs(func, argdict): return set(getRequiredArgs(func)).difference(argdict)
同样,要检查无效的参数,请使用:
def invalidArgs(func, argdict): args, varargs, varkw, defaults = inspect.getargspec(func) if varkw: return set() # All accepted return set(argdict) - set(args)
因此,是否可以调用的完整测试是:
def isCallableWithArgs(func, argdict): return not missingArgs(func, argdict) and not invalidArgs(func, argdict)
(这仅在python的arg解析方面是好的。任何运行时检查kwargs中的无效值显然都无法检测到。)