【问题标题】:How to pass a value to interactive input in a passive way in Python?如何在 Python 中以被动方式将值传递给交互式输入?
【发布时间】:2020-11-20 18:19:21
【问题描述】:

我使用了一个函数,它以交互方式从用户那里获取一些输入并返回一些值。我想运行该函数(无需更改它),而不必自己输入值,例如让它从列表中读取。我怎样才能做到这一点?

MCVE:

def add():
    a = int(input('first number: '))
    b = int(input('first number: '))
    return(a+b)

我希望能够运行 magic(add(), [2, 3]) 之类的东西来获得输出 5

【问题讨论】:

  • 您应该编写函数以将列表作为参数。
  • 我认为只有运行另一个输入一些数据的程序才有可能。
  • 您可以使用批处理或shell脚本将数据发送到程序
  • 您能否添加更多关于您为什么需要这样做的背景信息?如果可能的话,这似乎是一种应避免的模式。

标签: python input


【解决方案1】:

假设您在 Linux 或 wsl 上,您可以通过标准输入管道输入一些输入。即,

$ echo $'1\n3\n' | python scripy.py

应该产生4。如果你有一个内容相同的文件,你可以使用cat来做同样的事情

$ cat file.in | python script.py

仅在绝对必要时

python 也可以用来模拟标准输入。 sys.stdin 只是 StringIO 类的一个实例。我们可以使用带有我们选择的内容的 StringIO 类覆盖默认的 sys.stdin。

with StringIO(in_string) as f:
    tmp = sys.stdin
    sys.stdin = f
    add()
    sys.stdin = tmp

【讨论】:

  • 这很有帮助,但我确实需要在我的 python 代码中完成。
  • StringIO 仍然要求输入
  • 我明白了。似乎环境有所不同。谢谢。它有效。
【解决方案2】:

一种选择是在您模拟 input 的地方进行测试:

from unittest.mock import patch

@patch("builtins.input")
def test_add(mock_input):
    input_values = [2, 3]
    mock_input.side_effect = input_values
    expected_value = sum(input_values)
    actual_value = add()
    # print or log actual value here if you want to see the result
    assert actual_value == expected_value

如果您尝试自动使用某些令人讨厌地使用 input 的第三方功能,这是一个相当不错的方法,但如果您只是想测试他们的功能,那还不错。

【讨论】:

  • 这非常接近我的需要,但它在@patch 线上抱怨:Need a valid target to patch. You supplied: 'input'
  • 使用“builtins.input”,它会修补你想要的。它可能是“builtin.input”。我永远记不得了。
  • 嗯,试试@patch("builtins.input")stackoverflow.com/a/37449365/1011724 顺便说一句,运行此测试的最简单方法是通过 pytest
  • 非常感谢。那成功了。这非常有效。
【解决方案3】:

如果您的值包含在任意大小的列表中,那么sum 将起作用。

def add(A):
    return sum(A)

【讨论】:

    猜你喜欢
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2018-10-17
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多