Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python';s检查。签名和#x27;的签名似乎违反了python';签名规则_Python_Python Internals - Fatal编程技术网

Python';s检查。签名和#x27;的签名似乎违反了python';签名规则

Python';s检查。签名和#x27;的签名似乎违反了python';签名规则,python,python-internals,Python,Python Internals,inspect模块如何使它看起来像一个没有默认值的参数(尽管它有),以及这样做的原因是什么(如果有) inspect.Signature的帮助显示return\u注释参数,无默认值: 导入检查 >>>帮助(检查签名) (...) 类签名(builtins.object) |签名(参数=无,*,返回\注释,\验证\参数\为真) (...) 然而,人们只能用一个参数构造签名: >sig=inspect.Signature(无) >>>没什么坏事发生 这似乎违反了规定。查看签名类的代码,我发现:

inspect模块如何使它看起来像一个没有默认值的参数(尽管它有),以及这样做的原因是什么(如果有)

inspect.Signature的帮助显示
return\u注释
参数,无默认值:

导入检查 >>>帮助(检查签名) (...) 类签名(builtins.object) |签名(参数=无,*,返回\注释,\验证\参数\为真) (...) 然而,人们只能用一个参数构造签名:

>sig=inspect.Signature(无)
>>>没什么坏事发生
这似乎违反了规定。查看
签名
类的代码,我发现:

def\uuuu init\uuuu(self,parameters=None,*,return\u annotation=\u empty,\uuuu validate\u parameters\uuuu=True)
好的,
return\u注释毕竟有一个默认值(这就是为什么
inspect.Signature(None)
有效)

因此,问题是:

inspect模块是如何实现这种欺骗的?
这样做是否合理?

显然,
帮助
在引擎盖下调用
检查。签名(对象)
,其中
对象
是功能。这会将
inspect.Signature.empty
default参数处理为完全没有默认值

另一个例子:

>>> def thing(self, a=inspect.Signature.empty):
...     ...
... 
>>> help(thing)
Help on function thing in module __main__:

thing(self, a)  # Here it is!
通过运行以下命令,您可以查看发动机罩下的
帮助
功能:

import trace
trace.Trace().runfunc(help, thing)
对于我(Python 3.6),它显示了以下内容:

<snip>
pydoc.py(1357):             try:
pydoc.py(1358):                 signature = inspect.signature(object)
 --- modulename: inspect, funcname: signature
inspect.py(3002):     return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
 --- modulename: inspect, funcname: from_callable
inspect.py(2751):         return _signature_from_callable(obj, sigcls=cls,
<snip>
pydoc.py(1361):             if signature:
pydoc.py(1362):                 argspec = str(signature)

pydoc.py(1357):尝试:
pydoc.py(1358):签名=检查签名(对象)
---modulename:inspect,funcname:signature
inspect.py(3002):返回签名。from_callable(obj,follow_wrapped=follow_wrapped)
---modulename:inspect,funcname:from_callable
inspect.py(2751):返回可调用的签名(obj,sigcls=cls,
pydoc.py(1361):如果签名:
pydoc.py(1362):argspec=str(签名)
如果您在代码中复制它,您将得到以下结果:

>>> inspect.signature(thing)
<Signature (self, a)>
>>> str(_)
'(self, a)'  # huh?!
检查签名(东西) >>>str(u) (赛尔夫,a)#嗯?!
谢谢@ForceBru。我已经看到它与
检查有关。\u empty
(其中
inspect.Signature.empty
指向,但无法看到
\u empty
类型如何声明自己为“不可见”在帮助中,或者它为什么会这样做。它只是将参数标记为没有默认值。如果要以不同的方式实现
inspect.Signature
,则可以选择此类参数的不同表示形式,因此这不是真正的“欺骗”,这更多是一个实现细节。