gpt4 book ai didi

Python:使用检查制作函数签名

转载 作者:行者123 更新时间:2023-12-04 10:13:13 24 4
gpt4 key购买 nike

我无法弄清楚应该如何手动构建签名。文档说 parameters inspect.Signature 的论据应该是 OrderedDict .但这对我来说失败了。

甚至 parametersinspect.Signature实例,由 inspect.signature 返回功能不如 __init__争论:

>>> from inspect import Signature, signature
>>> def f(a, b: int, c=0, d: float=0.0): ...
...
>>> Signature(signature(f).parameters)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/twhalen/.pyenv/versions/3.8.2/lib/python3.8/inspect.py", line 2775, in __init__
kind = param.kind
AttributeError: 'str' object has no attribute 'kind'

但是 Signature(signature(f).parameters.values())工作正常。还有 type(signature(f).parameters.values())告诉我这是一个 odict_values ,不是 OrderedDict正如文档所说。

如何 应该一个构建一个 parameters inspect.Signature 的论据?
inspect之间是否错位的文档和代码的真实性就是这样,还是我遗漏了一些深刻的原因?

最佳答案

你错过了一些重要的东西(但不是很深刻)。 class attribute parameters 的文档阅读

An ordered mapping of parameters’ names to the corresponding Parameter objects. Parameters appear in strict definition order, including keyword-only parameters.



然而,这是类初始值设定项的输出。 __init__ 的文档参数 parameters读到:

The optional parameters argument is a sequence of Parameter objects, which is validated to check that there are no parameters with duplicate names, and that the parameters are in the right order, i.e. positional-only first, then positional-or-keyword, and that parameters with defaults follow parameters without defaults.



输入应该是一个序列,而不是一个映射。输出是 Signature 中的有序映射目的。 Signature除非您有特殊情况需要,否则类实际上并不意味着“手动”初始化。

型号 odict_values表示调用 OrderedDict.values 的结果.这是一个序列,这就是该特定调用起作用的原因。您可以打印有序字典以更好地了解正在发生的事情:
>>> signature(f).parameters
mappingproxy(OrderedDict([('a', <Parameter "a">), ('b', <Parameter "b: int">), ('c', <Parameter "c=0">), ('d', <Parameter "d: float = 0.0">)]))

您可以忽略 mappingproxy :它只是使整个事情只读。 Signature的初始化程序不需要映射,因为 Parameter对象已经包含参数的名称。

关于Python:使用检查制作函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61211894/

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