如何将字符串提供给 Python 中函数的输入语句?

How do I feed a string to a function's input statement in Python?

在 python 中,我有一个具有输入语句的函数,并假设该函数是一个黑盒,因此我无法编辑该函数。我不想让用户键入和输入,而是想向输入语句提供一个字符串。

我找到了一种方法,方法是启动 运行 函数的子进程并将字符串作为标准输入输入。

另一种方法是使用 PIPE。

有什么纯粹的python方法可以实现吗?

您可以修补模块的功能,例如mymodule.input = myfunc,然后你的函数将被调用,之后只是 return 来自你函数的字符串。

# mymodule
def func():
    print(input())
# main
import mymodule

def custom():
    return "my custom input"

mymodule.input = custom
mymodule.func()

然而,可能需要在mymodule导入其他任何地方之前发生。取决于 input() is called (e.g. as a global call in a module thus (import module already calling it indirectly) vs in a function, when it'd look into the globals() 将如何修补)

现在,有一个更深层次的补丁的替代方案,但我们不能像 input() is a built-in and implemented in C (so not much of a patching available :( ). We can, however, utilize a custom sys.stdin such as io.StringIO() by which you can write to own "stdin" (it's not the real process' STDIN 那样做很多事情,只是缓冲区替换,但这对于这个用例来说并不重要)。

然后调用一个简单的sys.stdin.write() with rewinding will do (again, has to happen before input()

import sys
from io import StringIO
sys.stdin = StringIO()
sys.stdin.write("myinput")
sys.stdin.seek(0)  # rewind, so input() can read
text = input()
print(f"{text=}")

如您所述,进程之间使用 PIPE from subprocess 或类似模块。

import mymodule
class Person:
    def __init__(self, name):
        self.name = name
    @property
    def email(self):
        return f"{name}@gmail.com}"
P = Person("Praddyumn")
mymodule.email = p.email

这里mymodule是一个以email作为参数的模块的例子,但是在classPerson中我们有email作为一个函数,但是通过使用 @property 装饰器,此函数 email 成为一个属性,因此您可以将其与纯 Python.

一起使用