使用生成器模拟输入

时间:2016-06-02 14:58:44

标签: python mocking yield

以下代码不会对输入进行模拟,有没有办法用生成器来做?

    inputlist = [5,1,2,3,4,5,6]

    def mock_input(dummy_prompt=">>> "):
        global inputlist
        for u in inputlist:
                yield str(u)

    __builtins__.input = mock_input

    l=[]
    x= input()
    for u in range(int(x)):
        l.append(int(input()))

    if l==inputlist[1:]:
        print("bravo")

错误是x是生成器而不是String。

我是否必须使用全局变量创建自己的生成器,或者我在语法中遗漏了一些内容。

2 个答案:

答案 0 :(得分:1)

好的,谢谢,我错过了生成器实例化的那一刻。

def gg(l):
    for u in l:
            yield str(u)


def mockinput(thelist):
    bob = gg(thelist)
    __builtins__.input = lambda prompt="toto":  str(next(bob))


inputlist = [6,1,2,3,4,5,6]
mockinput(inputlist)

l=[]
for u in range(int(input())):
    l.append(int(input()))
    print(l)

if l==inputlist[1:]:
    print("bravo")

所以我需要分两步,因为我不想要任何全局变量

答案 1 :(得分:0)

您要将生成器分配给__builtins__.input,而不是使用生成器进行迭代并返回值,这就是它无法正常工作的原因。

而是使用iter创建一个生成并使用next(..)

进行迭代
inputlist = [6,1,2,3,4,5,6]
gen = iter(inputlist)

def mock_input(dummy_prompt=">>> "):
    return str(next(gen))

__builtins__.input = mock_input

l=[]
x= input()
for u in range(int(x)):
    l.append(int(input()))

if l==inputlist[1:]:
    print("bravo")

PS:我将列表的第一个数字修改为6,否则你错过了一个项目并且没有打印