繁体   English   中英

如何找出python函数返回的输出数量?

[英]How can I find out the number of outputs returned by a python function?

想象一下,有两个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

由于此解决方案在函数返回元组时失败。

我开始ast使用python ast (抽象语法树)库,想知道是否有任何方法可以解析语法树来确定函数的输出数量?

类似于以下内容:

import inspect
import ast

src = inspect.getsourcelines(f1)[0]

string = ''.join(src)
ast_   = ast.parse(string)

我探索了ast_但无法找到收益。

从技术上讲,函数返回一个值。 一个值可能是一个元组,一个字典或任何任意复杂的对象(包括集合对象)。

多个返回值的出现仅仅是由于自动拆包和语法中一些糖的结果,而事实是Python中的元组运算符实际上是,(逗号;在返回语句中不需要括号,仅在以下情况下需要括号: ,(逗号)会模棱两可)。

因为Python是动态类型的,所以函数可以根据其参数或调用时程序的全局状态返回不同类型的值(对象)。 在同一程序(解释器/ VM)会话期间,它可以为不同的调用返回不同类型的对象。

您应该将函数的返回类型视为文档问题……任何编写良好的Python函数都将记录其返回类型(最好在doc字符串中)。

包裹在某些数据结构周围的类的方法返回self ...是相当普遍的,这允许使用“链式用法”模式: Foo.fiddle()。faddle()。spritz()。output() ..我们在一个简单的表达式中对对象执行全部一系列操作。

我同意这是一个有点奇怪的问题的评论……但是,按照您提出的方法回答您的问题,让我们从以下简化的假设开始:

  1. 每个函数的最后只有一个return语句

  2. 逗号可用于确定“输出数量”,即(x, 2)x, 2都被视为两个“输出”

  3. 从第2点开始,return语句由一系列变量(可能是列表或元组)组成,并且从未使用过更复杂的表达式(如生成器或列表推导)

我们假设以上情况,因为否则您几乎肯定会需要正确地解析有效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]: 3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM