python 你能列出一个函数收到的关键字参数吗?

更新时间:2024-03-22 下载TXT文档 下载Word文档

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

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

这样可以正常工作,但是如果d_args dict中的值不被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)

同样,要检查无效的args,请使用:

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中无效值的任何运行时检查。)

  • 太好了!我不知道这个功能!
  • 我相信这应该是公认的答案。
  • 鉴于使用代码对象的方法或多或少相同,是否有必要再导入一个模块......?
  • @jmets - 绝对 - 使用库模块几乎总是比滚动自己更好。此外,代码对象上的属性更内部,并且可以进行更改(例如,请注意,这已移至pyhon3中的代码)。使用该模块作为接口可以为您提供更多保障,以防其中一些内部组件发生变化。它也会做你可能没想过要做的事情,比如在你无法检查的函数上抛出适当的类型错误(例如C函数)。
  • 自Python 3.0起,inspect.getargspec(f)已弃用;现代方法是inspect.signature(f)
  • 仅供参考,如果你想支持Cython和Python,这个方法不适用于Cython'd函数。另一方面,co_varnames选项在两者中都有效。
  • 这非常有用。我不知道inspect的存在。

这将打印所有可通过参数的名称,关键字和非关键字参数:

def func(one, two="value"):
    y = one, two
    return y
print func.func_code.co_varnames[:func.func_code.co_argcount]

这是因为第一个co_varnames始终是参数(接下来是局部变量,如上例中的y)。

所以现在你可以有一个功能: 短码网-DuanMa.NET

def getValidArgs(func, argsDict):
    '''Return dictionary without invalid function arguments.'''
    validArgs = func.func_code.co_varnames[:func.func_code.co_argcount]
    return dict((key, value) for key, value in argsDict.iteritems() 
                if key in validArgs)

你可以这样使用:

>>> func(**getValidArgs(func, args))

编辑:一个小小的补充:如果你真的只需要一个函数的关键字参数,你可以使用func_defaults属性来提取它们:

def getValidKwargs(func, argsDict):
    validArgs = func.func_code.co_varnames[:func.func_code.co_argcount]
    kwargsLen = len(func.func_defaults) # number of keyword arguments
    validKwargs = validArgs[-kwargsLen:] # because kwargs are last
    return dict((key, value) for key, value in argsDict.iteritems() 
                if key in validKwargs)

你现在可以用已知的args调用你的函数,但是提取的kwargs,例如:

func(param1, param2, **getValidKwargs(func, kwargsDict))

这假设func在其签名中不使用*args**kwargs魔术。

  • 如果我只想打印出"关键字"参数"键"怎么办?

在Python 3.0中:

>>> import inspect
>>> import fileinput
>>> print(inspect.getfullargspec(fileinput.input))
FullArgSpec(args=['files', 'inplace', 'backup', 'bufsize', 'mode', 'openhook'],
varargs=None, varkw=None, defaults=(None, 0, '', 0, 'r', None), kwonlyargs=[], 
kwdefaults=None, annotations={})

对于Python 3解决方案,您可以使用inspect.signature并根据您想要了解的参数类型进行过滤。

使用位置或关键字,仅关键字,var位置和var关键字参数采样示例函数:

def spam(a, b=1, *args, c=2, **kwargs):
    print(a, b, args, c, kwargs)

您可以为它创建签名对象:

from inspect import signature
sig =  signature(spam)

然后使用列表推导过滤以找出所需的详细信息:

>>> # positional or keyword
>>> [p.name for p in sig.parameters.values() if p.kind == p.POSITIONAL_OR_KEYWORD]
['a', 'b']
>>> # keyword only
>>> [p.name for p in sig.parameters.values() if p.kind == p.KEYWORD_ONLY]
['c']

类似地,对于使用p.VAR_POSITIONAL和var关键字与VAR_KEYWORD的var位置。

此外,您可以通过检查p.default是否等于p.empty来向if添加子句以检查是否存在默认值。

扩展DzinX的答案:

argnames = example.func_code.co_varnames[:func.func_code.co_argcount]
args = dict((key, val) for key,val in d_args.iteritems() if key in argnames)
example(**args)

以上就是短码网小编为大家整理的《python 你能列出一个函数收到的关键字参数吗?》相关内容,希望大家喜欢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若内容造成侵权/违法违规/事实不符,请将联系本站反馈,一经查实,立即处理!

python 你能列出一个函数收到的关键字参数吗?》文档下载仅供参考学习,下载后请在24小时内删除。

转载注明出处:https://www.duanma.net/article/8843417f296.html

回到顶部