当没有跳过输入的选项时,如何绕过 Python3 中的输入提示?

How can you bypass an input prompt in Python3 when there is no option to skip the input?

使用一个库,当我调用我将调用的某个函数时 foo() ,系统会提示我这样输入:

def foo():
   if input("Proceed?") == 'yes':
        take_action()

我需要回答才能继续。

但我希望能够使用默认值遍历 foo() 来提供提示。

问题是开发人员没有提供为提示提供默认值的选项。

理想情况下,他们会这样写 foo()

def foo(default_response=None):
    if default_response == 'yes':
        take_action()
    elif input("Proceed?") == 'yes':
        take_action()

鉴于他们没有提供默认响应的选项,我有没有办法在不更改源代码的情况下循环 foo() 并自动提供输入?

一种解决方案是monkey patch库临时替换input函数。例如,如果我的模块 foo.py 看起来像这样:

def take_action():
    print("doing something")


def foo():
    if input("Proceed? ") == "yes":
        take_action()

我可以这样写bar.py

import foo
from unittest import mock


def fake_input(default_response=None):
    '''Creates a replacement for the `input` function that will
    return a default response if one was provided.'''

    def _input(prompt):
        return default_response if default_response else input(prompt)

    return _input


with mock.patch("foo.input", new=fake_input("yes")):
    foo.foo()

foo.foo()

如果你运行这段代码,你会看到第一个调用foo.foo() 使用默认输入,并在没有提示的情况下继续。第二个电话 to foo.foo() 会正常提示。