gpt4 book ai didi

python - 给定函数的位置参数的名称,是否可以确定参数的位置?

转载 作者:行者123 更新时间:2023-11-28 21:54:01 27 4
gpt4 key购买 nike

我正在开发一个玩具 Python 类型检查器,使用 Python 3 中的函数注释功能来定义函数参数和返回值的类型,我似乎在检查一个函数类型是否是其他。取这两个函数:

def f(x: int, y: int) -> type(None):
pass

def g(a: object, b: int) -> type(None):
pass

我想让我的代码确定 g 的类型是 f 类型的子类型(因为每个 f 的类型code>的参数是g参数列表中同索引参数类型的子类型,g的返回类型是g的子类型f 的返回类型)。但是,__annotations__ 字段是一个字典:

f.__annotations__ == { 'x': int, 'y': int, 'return': type(None) }

这意味着它没有提供我认为我需要的有关参数排序的信息。是否有可靠的方法来确定 xf 的第一个参数,仅通过检查 f 的运行时属性?

最佳答案

是的,Python 函数确实携带了该信息。

最简单的方法是使用 inspect.getfullargspec()函数提取此信息,或从 Python 3.3 开始,使用 Signature objects .

inspect.getfullargspec() 返回值有一个 .args 属性按顺序列出参数:

>>> import inspect
>>> def f(x: int, y: int) -> type(None):
... pass
...
>>> def g(a: object, b: int) -> type(None):
... pass
...
>>> inspect.getfullargspec(f)
FullArgSpec(args=['x', 'y'], varargs=None, varkw=None, defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'NoneType'>})
>>> inspect.getfullargspec(f).args
['x', 'y']
>>> inspect.getfullargspec(g).args
['a', 'b']

注释也包括在内:

>>> inspect.getfullargspec(f).annotations
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'NoneType'>}
>>> inspect.getfullargspec(g).annotations
{'return': <class 'NoneType'>, 'a': <class 'object'>, 'b': <class 'int'>}

签名对象更丰富:

>>> sig_f = inspect.signature(f)
>>> sig_g = inspect.signature(g)
>>> sig_f.parameters
mappingproxy(OrderedDict([('x', <Parameter at 0x1031f1ea8 'x'>), ('y', <Parameter at 0x102e00228 'y'>)]))
>>> sig_f.parameters['x'].annotation
<class 'int'>
>>> sig_g.parameters['b'].annotation
<class 'int'>
>>> sig_f.return_annotation == sig_g.return_annotation
True

其中 Signature.parameters 使用有序字典,让您以正确的顺序比较参数。

关于python - 给定函数的位置参数的名称,是否可以确定参数的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24974591/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com