簡體   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