是的,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
es一個有序的字典,讓您按照正確的順序比較參數。
很棒,感謝您的快速響應!所以我不會讓我接受它,直到再過10分鐘,但這完全回答了我的問題。 – jcsmnt0