给定一个任何类型的Python对象,是否有一种简单的方法来获取该对象具有的所有方法的列表?
要么,
如果这是不可能的,至少有一种简单的方法来检查它是否有一个特定的方法,而不仅仅是检查方法被调用时是否发生错误?
我想迭代一个类中的方法,或者根据存在的方法以不同的方式处理类或实例对象.如何获取类方法列表?
另见:
我正在编写C扩展,我想让我的方法的签名可见为内省.
static PyObject* foo(PyObject *self, PyObject *args) {
/* blabla [...] */
}
PyDoc_STRVAR(
foo_doc,
"Great example function\n"
"Arguments: (timeout, flags=None)\n"
"Doc blahblah doc doc doc.");
static PyMethodDef methods[] = {
{"foo", foo, METH_VARARGS, foo_doc},
{NULL},
};
PyMODINIT_FUNC init_myexample(void) {
(void) Py_InitModule3("_myexample", methods, "a simple example module");
}
Run Code Online (Sandbox Code Playgroud)
现在,如果(在构建它之后......)我加载模块并查看它的帮助:
>>> import _myexample
>>> help(_myexample)
Run Code Online (Sandbox Code Playgroud)
我会得到:
Help on module _myexample:
NAME
_myexample - a simple example module
FILE
/path/to/module/_myexample.so
FUNCTIONS
foo(...)
Great example function
Arguments: (timeout, flags=None)
Doc blahblah doc doc …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚从模块中检索的方法的参数.我发现了一个inspect带有便利功能的模块getargspec.它适用于我定义的函数,但不适用于导入模块的函数.
import math, inspect
def foobar(a,b=11): pass
inspect.getargspec(foobar) # this works
inspect.getargspec(math.sin) # this doesn't
Run Code Online (Sandbox Code Playgroud)
我会收到这样的错误:
File "C:\...\Python 2.5\Lib\inspect.py", line 743, in getargspec
raise TypeError('arg is not a Python function')
TypeError: arg is not a Python function
Run Code Online (Sandbox Code Playgroud)
被inspect.getargspec设计为仅供本地功能还是我做错了什么?
以下代码定义了一个简单的 Cython 函数(为了方便起见,使用 Ipython magic)。
%load_ext cython
%%cython
def f(float x, float y=2):
return x+y
Run Code Online (Sandbox Code Playgroud)
然后,调用help(f)会给出以下消息:
Help on built-in function f in module _cython_magic_e37eeabbc63d5167217465ba978239fc:
f(...)
Run Code Online (Sandbox Code Playgroud)
f请注意,未显示 的参数。此外,制表符补全对于 ipython 中的参数名称也不起作用(例如键入f(xthen tab)。
如果我在不使用 Cython 的情况下定义此函数:
def g(x, y=2):
return x+y
Run Code Online (Sandbox Code Playgroud)
调用help(g)给出了这个并且制表符完成按预期工作:
Help on function g in module __main__:
g(x, y=2)
Run Code Online (Sandbox Code Playgroud)
有没有办法通过 Cython 函数获得这种行为?我尝试使用def, cdef, cpdef, 有或没有 ipython 魔法,但没有成功。