首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何才能找到python函数返回的输出数?

如何才能找到python函数返回的输出数?
EN

Stack Overflow用户
提问于 2014-12-25 21:32:40
回答 2查看 1.3K关注 0票数 1

假设有两个Python函数:

代码语言:javascript
运行
复制
def f1(x):
    return x

def f2(x):
    return x,x**2

我想知道f1返回了多少输出,f2返回了多少输出。

我想避免以下解决方案:

代码语言:javascript
运行
复制
result = f1(1)
no_outputs = len(result) if type(result) == tuple else 1

因为当函数返回元组时,此解决方案将失败。

我开始使用python语法树( ast (抽象语法树)库),并且想知道是否有任何方法来解析函数的语法树来计算返回的输出数?

与…有关的东西:

代码语言:javascript
运行
复制
import inspect
import ast

src = inspect.getsourcelines(f1)[0]

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

我研究了ast_,但找不到回报。

EN

回答 2

Stack Overflow用户

发布于 2014-12-25 22:40:16

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

多个返回值的出现仅仅是自动解包装的一些语法糖的结果,并且Python中的元组运算符实际上是,(逗号;括号在返回语句中不是必要的,只有在,(逗号)不明确的情况下才需要)。

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

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

包在某些数据结构中的类的方法通常返回self .它允许一种“连锁使用”模式: Foo.fiddle().faddle().spritz().output() .在这里,我们对对象执行了一系列的操作,所有操作都是以一个简洁的表达式进行的。

票数 5
EN

Stack Overflow用户

发布于 2014-12-25 22:19:42

我同意这是个有点奇怪的问题.然而,为了按照您建议的方法回答您的问题,让我们从以下简化假设开始:

  1. 只有一个返回语句,它发生在每个函数的末尾。
  2. 逗号可以用来确定“输出的数量”,即(x, 2)x, 2都被认为是两个“输出”。
  3. 从第2点开始,返回语句由一系列变量(可能是列表或元组)组成,从来不像生成器或列表理解那样复杂。

我们假设以上情况,因为否则您几乎肯定需要正确解析有效Python代码的子集,例如通过构建AST。鉴于以上所述,您从inspect.getsourcelines()返回的列表中获取最后一个字符串,并匹配一个正则表达式:

代码语言:javascript
运行
复制
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

通过返回变量元组进行测试:

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27650877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档