Есть ли в Python способ имитировать ввод с клавиатуры для функции, которая запрашивает ввод? - PullRequest
0 голосов
/ 10 января 2020

В моем коде есть функция, которая запрашивает у пользователя ввод:

def function_1():
    ...
    x = input('Please provide input')
    ...
    return something

Я хочу иметь возможность запустить мой код, и когда программа в конечном итоге достигает function_1 и запрашивает у пользователя ввод, автоматически предоставьте ему некоторый указанный ввод. При тестировании модулей я могу использовать библиотеку макетов для имитации ввода с клавиатуры, как показано ниже:

@mock.patch('builtins.input', side_effects=[1,2,3])
function_1()
function_1()
function_1()

Это вызывает функцию три раза и обеспечивает вводы {1, 2, 3}. Мне интересно, есть ли способ сделать то же самое за пределами юнит-тестирования.

Я знаю, что могу переписать код или использовать pipe в терминале. Но мне более любопытно, может ли это быть решено способом, описанным выше.

Ответы [ 2 ]

1 голос
/ 10 января 2020

Самое замечательное в Python заключается в том, что вы можете переопределить практически любую функцию, даже встроенную.

def override():
  from itertools import count
  counter = count()
  return lambda *args, **kwargs: next(counter)
input = override()

def x():
  return input("Testing123")

print(x())  # 1
print(x())  # 2 
print(x())  # 3

Хотя это необходимо сделать до вызова ваших функций.

1 голос
/ 10 января 2020

Один из способов - перезаписать sys.stdin:

import sys
from io import StringIO

oldstdin = sys.stdin
sys.stdin = StringIO("1\n2\n3\n")

assert input() == "1"
assert input() == "2"
assert input() == "3"

sys.stdin = oldstdin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...