在Java中使用Jython获取Python参数

时间:2017-05-31 13:00:50

标签: java python jython

我正在尝试解析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

谢谢

2 个答案:

答案 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)

我使用了来自answermata

  
    

使用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());   
});