我试图让函数的输出表现得好像是我的输入。目标是从旧输出中创建一个新输出。
我有一些看起来像这样的代码:
def func():
BLOCK OF CODE
func()
函数中没有return语句,括号内没有参数。
当我输入func()
来调用我的函数时,如上所示,我得到了所需的输出,这是一堆打印的语句。现在我想用该输出做一些事情以获得另一个输出。
我所要做的就是将一个函数的输出有效地“管道”到另一个函数的输入中(或者,如果可能的话,甚至不用担心创建另一个函数,而是更直接地做一些事情)。我调查了Python 3 writing to a pipe
但它没有帮助我。我还尝试定义另一个函数并使用前面的函数作为参数,它也不起作用:
def another_func(func):
print another_statement
another_func(func)
我也试过制作一个闭包(这种“有点”,因为至少它印的是func()打印的相同的东西,但仍然不是很鼓励):
def func():
def another_func():
print another_statement
BLOCK OF CODE
another_func()
最后,我尝试设计一个装饰器和一个嵌套函数来完成这个,但是我的函数中没有参数,它真的抛弃了我的代码(根本没有打印任何东西)。
有关如何操作函数输出的任何建议,就像它是您的输入一样,以便可以创建新的输出?
答案 0 :(得分:2)
你可以通过使用装饰器重定向stdout来实现这一点:
from StringIO import StringIO
import sys
def pipe(f):
def decorated(*args, **kwargs):
old,sys.stdout = sys.stdout,StringIO()
try:
result = f(*args, **kwargs)
output = sys.stdout.getvalue()
finally:
sys.stdout = old
return result, output
return decorated
然后,您可以从任何修饰函数中获取result, output
对,例如:
@pipe
def test(x):
print x
return 0
test(3) -> (0, '3\n')
但是,我想不出你为什么想要这样做的充分理由。
(实际上,这不是相当是真的;在为用户IO编写单元测试时很方便,例如在软件工程课程中测试学生作业时。我很怀疑OP是什么尽管如此。)
答案 1 :(得分:1)
从函数中返回所需的值 - 而不是在控制台上打印值,将它们作为字符串,数字,列表或任何其他有意义的类型返回。否则,您如何期望" connect"如果没有输出开始,则函数的输出作为另一个的输入?
当然,在控制台上打印并不算作输出,除非您计划最终使用操作系统管道或类似机制连接控制台上的两个程序,但是保持简单!只需使用函数的返回值,并在以后担心管道,特别是如果您的问题特别需要它。
阅读评论后:"连接"从一个打印到控制台上的两个函数和另一个从控制台读取的两个函数在这种情况下是一个非常糟糕的主意,首先你必须掌握函数返回值的方式,相信我这个:你必须重新考虑您的计划!即使其他答案(严格来说)回答了你原来的问题,那绝对不是你应该做的。
答案 2 :(得分:1)
只是为了好玩......因为OP要求它
import StringIO
import sys
def func1():
for i in range(1,10):
print "some stuff %d"%i
def func2(func):
old_std = sys.stdout
sys.stdout = StringIO.StringIO()
try:
func()
return sys.stdout.getvalue().splitlines()
finally:
sys.stdout = old_std
print func2(func1)
答案 3 :(得分:0)
您需要return
来自您的函数的值。这可用于将值分配给另一个变量。
假设我定义了一些将输入加倍的函数doubleThis
def doubleThis(x):
print 'this is x :', x
return x * 2 # note the return keyword
现在我可以使用3
调用该函数,并按预期返回6
>>> doubleThis(3)
this is x : 3
6
现在我有另一个函数subtractOne
返回输入值减去1。
def subtractOne(i):
print 'this is i :', i
return i - 1
现在回答你的问题。请注意,我们可以将第一个函数作为第二个函数的输入,因为它具有return
值。
>>> subtractOne(doubleThis(3))
this is x : 3
this is i : 6
5