假设有两个Python函数:
def f1(x):
return x
def f2(x):
return x,x**2我想知道f1返回了多少输出,f2返回了多少输出。
我想避免以下解决方案:
result = f1(1)
no_outputs = len(result) if type(result) == tuple else 1因为当函数返回元组时,此解决方案将失败。
我开始使用python语法树( ast (抽象语法树)库),并且想知道是否有任何方法来解析函数的语法树来计算返回的输出数?
与…有关的东西:
import inspect
import ast
src = inspect.getsourcelines(f1)[0]
string = ''.join(src)
ast_ = ast.parse(string)我研究了ast_,但找不到回报。
发布于 2014-12-25 22:19:42
我同意这是个有点奇怪的问题.然而,为了按照您建议的方法回答您的问题,让我们从以下简化假设开始:
(x, 2)和x, 2都被认为是两个“输出”。我们假设以上情况,因为否则您几乎肯定需要正确解析有效Python代码的子集,例如通过构建AST。鉴于以上所述,您从inspect.getsourcelines()返回的列表中获取最后一个字符串,并匹配一个正则表达式:
In [47]: def f2(x):
....: return x, x**2
In [48]: ret2 = inspect.getsourcelines(f2)
In [49]: ret2
Out[49]: ([u'def f2(x):\n', u' return x, x**2\n'], 1)
In [55]: ret_pattern = r'return\s*(.*)\n*$'
In [56]: out2 = re.findall(ret_pattern, ret2[0][-1])
In [57]: out2
Out[57]: [u'x, x**2']
In [58]: len(out2[0].split(','))
Out[58]: 2通过返回变量元组进行测试:
In [59]: def f3(x):
....: return (x, x**2, x**3)
....:
In [62]: out3 = re.findall(ret_pattern, inspect.getsourcelines(f3)[0][-1])
In [63]: len(out3[0].split(','))
Out[63]: 3https://stackoverflow.com/questions/27650877
复制相似问题