Python 获取NumPy数组对象的签名
我正在创建的python编辑器中实现上下文帮助 我想要得到类的方法和那些方法的参数,但我也想要对象的方法 对于NumPy数组,如果执行以下操作:Python 获取NumPy数组对象的签名,python,arrays,numpy,inspect,method-signature,Python,Arrays,Numpy,Inspect,Method Signature,我正在创建的python编辑器中实现上下文帮助 我想要得到类的方法和那些方法的参数,但我也想要对象的方法 对于NumPy数组,如果执行以下操作: import numpy as np import inspect _members = inspect.getmembers(np) for _member in _members: _params = str(inspect.signature(_member[1])) 这没问题。但当我这样做的时候: import numpy as np
import numpy as np
import inspect
_members = inspect.getmembers(np)
for _member in _members:
_params = str(inspect.signature(_member[1]))
这没问题。但当我这样做的时候:
import numpy as np
import inspect
ar = np.array([1,2,3,4])
_members = inspect.getmembers(type(ar))
for _member in _members:
_params = str(inspect.signature(_member[1]))
<method 'copy' of 'numpy.ndarray' objects>
我在尝试获取签名时出错。每个\u成员[1]
如下所示:
import numpy as np
import inspect
ar = np.array([1,2,3,4])
_members = inspect.getmembers(type(ar))
for _member in _members:
_params = str(inspect.signature(_member[1]))
<method 'copy' of 'numpy.ndarray' objects>
我的问题:有没有办法打开签名?如果这是不可能的,是否有一个解决方法来获取方法参数
这不仅考虑了
np.array
。我想获得任何类型的类或对象的方法和参数。使用numpydoc
模块可以获得的大多数签名,但可能不是所有签名:
>>> import numpy as np
>>> import inspect
>>> import numpydoc
>>> from pprint import pprint
>>>
# inspect doesn't work
>>> inspect.signature(np.ndarray.transpose)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/paul/local/lib/python3.6/inspect.py", line 3002, in signature
return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
File "/home/paul/local/lib/python3.6/inspect.py", line 2752, in from_callable
follow_wrapper_chains=follow_wrapped)
File "/home/paul/local/lib/python3.6/inspect.py", line 2231, in _signature_from_callable
skip_bound_arg=skip_bound_arg)
File "/home/paul/local/lib/python3.6/inspect.py", line 2061, in _signature_from_builtin
raise ValueError("no signature found for builtin {!r}".format(func))
ValueError: no signature found for builtin <method 'transpose' of 'numpy.ndarray' objects>
>>>
>>> info = numpydoc.docscrape.FunctionDoc(np.ndarray.transpose)
>>> info['Signature']
'a.transpose(*axes)'
>>> pprint(info['Parameters'])
[('axes',
'None, tuple of ints, or `n` ints',
['',
'* None or no argument: reverses the order of the axes.',
'',
"* tuple of ints: `i` in the `j`-th place in the tuple means `a`'s",
" `i`-th axis becomes `a.transpose()`'s `j`-th axis.",
'',
'* `n` ints: same as an n-tuple of the same ints (this form is',
' intended simply as a "convenience" alternative to the tuple form)'])]
>>>
>>> info = numpydoc.docscrape.FunctionDoc(np.ndarray.std)
>>> info['Signature']
'a.std(axis=None, dtype=None, out=None, ddof=0, keepdims=False)'
# sometimes info is incomplete
>>> pprint(info['Parameters'])
[]
>>将numpy作为np导入
>>>进口检验
>>>输入numpydoc
>>>从pprint导入pprint
>>>
#检查不起作用
>>>检查签名(np.ndarray.transpose)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/home/paul/local/lib/python3.6/inspect.py”,第3002行,签名
返回签名。from_callable(obj,follow_wrapped=follow_wrapped)
文件“/home/paul/local/lib/python3.6/inspect.py”,第2752行,from_callable
follow_wrapper_chains=follow_wrapped)
文件“/home/paul/local/lib/python3.6/inspect.py”,第2231行,在可调用的
跳过\u绑定\u参数=跳过\u绑定\u参数)
文件“/home/paul/local/lib/python3.6/inspect.py”,第2061行,来自内置
raise VALUERROR(“未找到内置{!r}.format(func)的签名”)
ValueError:找不到内置的签名
>>>
>>>info=numpydoc.docscrape.FunctionDoc(np.ndarray.transpose)
>>>信息[“签名”]
‘a.转置(*轴)’
>>>pprint(信息['参数])
[(“轴”,
'None,整数元组,或'n'ints',
['',
“*无或无参数:反转轴的顺序。”,
'',
“*整数元组:`i`在元组中的`j`-第四位表示`a`'s”,
“`i`-th轴变成`a.transpose()``j`-th轴。”,
'',
'*`n`ints:与相同ints的n元组相同(此形式为',
'仅作为元组形式的“方便”替代品)]]
>>>
>>>info=numpydoc.docscrap.FunctionDoc(np.ndarray.std)
>>>信息[“签名”]
'a.std(axis=None,dtype=None,out=None,ddof=0,keepdims=False)'
#有时信息是不完整的
>>>pprint(信息['参数])
[]
np.array
是一个函数(具有自己的签名
),用于创建np.ndarray
对象。第一个代码块查看np
模块中的对象(主要是常量、函数和类)。第二个块查看类的方法(和其他类属性)。您需要将签名
行包装在try
块中,因为类的所有属性都不是方法(可调用)。例如,属性“T”
是一个属性,而不是可调用的。我很惊讶您的第一个代码块也能工作,因为np
具有不可调用的成员,例如常量。ipython
在提供此类帮助方面做得很好,选项卡已完成,?
(文档)和?
(代码)。你可以玩这个游戏,看看你可以访问什么类型的签名以及访问什么。你的答案非常有用。我设法对所有的numpy对象进行了概括。仍然需要保存其他类型的内置对象,我正在查看ipython
作为建议的注释。如果我能找到解决方案,我会把它贴在这里。