您可以列出函数接收的关键字参数吗?

dbr:

我有一个字典,我需要将键/值作为关键字参数传递..例如。

d_args = {'kw1': 'value1', 'kw2': 'value2'}
example(**d_args)

这可以正常工作,但是如果d_args字典中存在example函数不接受的值,则它显然会死掉。.说,如果将示例函数定义为def example(kw2):

这是一个问题,因为我无法控制d_argsexample函数的生成。它们都来自外部模块,并且example仅接受dict中的某些关键字参数。

理想情况下,我会做

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中的无效值显然都无法检测到。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

您可以解释func关键字和函数名称之间的参数吗?

您可以在JAVA中覆盖THIS关键字吗

我可以在Python包装函数中仅传递关键字参数的关键字名称吗?

我可以从被调用函数内部区分位置参数和关键字参数吗?

可以通过位置或关键字接受参数的常见Lisp函数吗?

的“ is”关键字是函数吗?

关键字“ foreach”可以获取数组参数吗?

您可以将“异步关键字异步”功能转换为“非异步关键字异步”功能吗?

可以部分应用不带关键字参数的函数的第二个参数吗?

可以部分应用不带关键字参数的函数的第二个参数吗?

您可以在ETW中使用自定义关键字吗

从函数的关键字参数生成TypedDict

用关键字参数定义函数

是res / req关键字,还是您可以随意命名?

设置关键字参数的默认值时,可以引用位置参数吗?

get()接收关键字参数'uuid'的多个值

'(A)' 是关键字吗?

我们可以在UDF中使用关键字参数吗

可以在不提供默认值的情况下使用关键字参数吗?

我可以将关键字用作robotframework中的参数吗?

使用multiprocessing.Pool.map()函数和关键字参数吗?

可以在初始化的函数指针声明中将`auto`关键字用作返回类型吗?

PHP中的非匿名函数可以使用'use'关键字吗?

有什么方法可以对函数Parameter使用'var'关键字吗?

确定函数的参数和关键字参数

Antlr可以忽略某些关键字吗?

zsh可以读取保留的终端关键字吗?

Java包名称可以用作关键字吗?

瞬态关键字可以标记方法吗?