我正在尝试解析python脚本以获取函数名称及其参数,我需要使用java来完成。
我设法使用Jython获取他们的名字,但我找不到任何方法来获取他们的参数(名称,数量?)。
Python示例:
def multiply_by_two(number):
"""Returns the given number multiplied by two
The result is always a floating point number.
This keyword fails if the given `number` cannot be converted to number.
"""
return float(number) * 2
def numbers_should_be_equal(first, second):
print '*DEBUG* Got arguments %s and %s' % (first, second)
if float(first) != float(second):
Java代码:
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile(file.getAbsolutePath());
PyStringMap map=(PyStringMap)interpreter.getLocals();
for (Object key : map.keys()) {
Object o=map.get(Py.java2py(key));
if (o instanceof PyFunction) {
System.out.println((String)key); // the function name
PyFunction function = (PyFunction) o;
}
}
我开始对找到一种方法失去希望......
如果有人有想法,即使不使用Jython
谢谢
答案 0 :(得分:0)
函数的内部__code__
字典属性具有函数变量名的co_varnames
元组属性,例如:
def t(t1, t2): pass
t.__code__.co_nlocals
>>> ('t1', 't2')
对于带有默认值的关键字参数,还有t.__defaults__
。
虽然__code__
是内部实现,但它可能会在解释器之间发生变化。 AFAIK,它是Python 2.6 +的规范的一部分。
答案 1 :(得分:0)
使用inspect.getargspec()在python中进行是一个选项,例如 在execfile之后执行类似
的操作interpreter.exec("import inspect"); PyStringMap map=(PyStringMap)interpreter.eval("dict([(k, inspect.getargspec(v)) for (k, v) in locals().items() if inspect.isfunction(v)]) ")
以下是工作代码:
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile(file.getAbsolutePath());
interpreter.exec("import inspect");
PyDictionary dico=(PyDictionary) interpreter.eval("dict([(k, inspect.getargspec(v).args) for (k, v) in locals().items() if inspect.isfunction(v)])");
ConcurrentMap<PyObject, PyObject> map= dico.getMap();
map.forEach((k,v)->{
System.out.println(k.toString());
System.out.println(v.toString());
});