Python';s检查。签名和#x27;的签名似乎违反了python';签名规则
inspect模块如何使它看起来像一个没有默认值的参数(尽管它有),以及这样做的原因是什么(如果有) inspect.Signature的帮助显示Python';s检查。签名和#x27;的签名似乎违反了python';签名规则,python,python-internals,Python,Python Internals,inspect模块如何使它看起来像一个没有默认值的参数(尽管它有),以及这样做的原因是什么(如果有) inspect.Signature的帮助显示return\u注释参数,无默认值: 导入检查 >>>帮助(检查签名) (...) 类签名(builtins.object) |签名(参数=无,*,返回\注释,\验证\参数\为真) (...) 然而,人们只能用一个参数构造签名: >sig=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
,则可以选择此类参数的不同表示形式,因此这不是真正的“欺骗”,这更多是一个实现细节。