繁体   English   中英

使用标准输入和标准输出将 python 程序转换为 function

[英]convert python program using stdin and stdout to a function

我有许多编程挑战问题和提交(用 python 编写)对。

大多数提交从 STDIN 获取输入(主要使用input()sys.stdin.readline()函数)并生成 output 到 STDOUT(主要使用print()函数)。

是否有一种优雅的方法可以将此类程序转换为单个函数,将 STDIN 输入作为参数,将 STDOUT 输出作为返回值?

例如,假设我有一个程序,它将名称作为输入并打印连接的字符串。

name = input()
print(f"Hi, {name}!")

我想做的是自动制作一个 function,如下所示。

def solution(name):
    output = f"Hi, {name}!"
    return output

我可以想到两个选择:

  1. 在 IDE 中使用重构工具。 这不会是完全自动的,因为您仍然需要打开每个文件,突出显示代码,然后调用操作来创建 function。 也许这可以通过插件自动化。

  2. 您可以编写另一个 python 脚本来为您执行此操作。 打开文件,读取代码行,然后写出您想要的新版本代码。

如果您想在运行时对期望在标准输入上输入并输出到标准输出的任何给定 function 执行此操作,当然可以。

它不是超级优雅(因为也没有contextlib.redirect_stdin ),但是:

import contextlib
import io
from unittest.mock import patch


@contextlib.contextmanager
def patch_io(input_text):
    """
    Patch sys.stdin so it reads from the given input string, and patch sys.stdout
    so it writes to a StringIO object. The StringIO object is yielded as the context value.
    """
    out_io = io.StringIO()
    with patch("sys.stdin", io.StringIO(input_text)), patch("sys.stdout", out_io):
        yield out_io


def fun():
    name = input()
    print(f"Hi, {name}!")


def main():
    with patch_io(input_text="John\n") as out_io:
        fun()

    print(f"The output is: {out_io.getvalue()!r}")


if __name__ == "__main__":
    main()

这打印出来

The output is: 'Hi, John Madden!\n'

暂无
暂无

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

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