Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 包含输入/输出的导入模块_Python_Python 3.x_Python Unittest - Fatal编程技术网

Python 包含输入/输出的导入模块

Python 包含输入/输出的导入模块,python,python-3.x,python-unittest,Python,Python 3.x,Python Unittest,我有一个python模块文件(func.py)和一个单元测试文件(f_test.py): 及 当我运行f_test.py时,我希望测试套件能够(成功)执行。 然而,我看到了以下输入: Finding files... done. Importing test modules ... Enter x: 如果我从func.py注释掉输入/输出行,那么我将得到预期的行为。 如何在不修改func.py的情况下实现它?当然,正确的答案是修改func.py。如果绝对地、肯定地不修改func.py,则可以重

我有一个python模块文件(
func.py
)和一个单元测试文件(
f_test.py
):

当我运行
f_test.py
时,我希望测试套件能够(成功)执行。 然而,我看到了以下输入:

Finding files... done.
Importing test modules ... Enter x:
如果我从
func.py
注释掉输入/输出行,那么我将得到预期的行为。
如何在不修改
func.py
的情况下实现它?

当然,正确的答案是修改
func.py
。如果绝对地、肯定地不修改
func.py
,则可以重定向标准输入:

# f_test.py

import os
import sys
import unittest

oldstdin, sys.stdin = sys.stdin, StringIO.StringIO('7')
try:
  from func import f
finally:
  sys.stdin = oldstdin

class MyTest(unittest.TestCase):
    def test(self):
        self.assertEqual(f(1), 2)

导入
func
时,将运行其中的所有代码。运行定义
def(x)…
创建函数
f

您可以通过使用
来区分导入和运行文件,前提是

例如:

# func.py

def f(x):
    return x + 1

if __name__ == '__main__':
    x = input("Enter x: "))
    print("f(x): " + str(f(x)))

当您运行
func.py
时,
\uuuuu name\uuuu==''uuuuuu main\uuuu'
将为真。导入时,它将为false(
\uuu name\uuu
将改为
'func'

您需要添加到f\u test.py的底部:

if __name__ == '__main__':
    unittest.main()

这样,当文件运行时将执行测试(我忘记这一点的次数比我想承认的要多)。

这是怎么回事?在所有代码都运行完之前,您无法完成导入
func
,而在等待您回答
输入时,代码无法完成运行。我知道您说过您不想修改func.py,但是。。。您应该修改func.py。使用so
x=input
导入模块时不会执行。不只是“应该”,避免修改func.py的唯一方法是安装导入钩子,或者预处理并手动执行结果,而不是导入。(好吧,我想你可以编译它,从中挖掘编译后的代码对象,构造一个函数,然后运行它……但这并不简单。)另外,值得注意的是,运行
func.py
肯定会引发
类型错误:无论键入什么,都不能隐式地将'int'对象转换为str
,那么…你为什么不首先修改它?@abarnert-我想我们可以称之为测试驱动开发。如果OP不清楚:函数(和类等)定义是代码。编译模块不会创建
f
,只运行模块中的代码创建
f
。Python看不出“创建
f
”的代码(您希望它运行)和“等待输入的代码”(您不希望)之间有什么区别;这都是代码。这不就是要引发一个
EOFError
,仍然阻止他的代码运行吗?我已经将另一个答案标记为正确,但您的解决方案也很有趣,所以+1:)
# func.py

def f(x):
    return x + 1

if __name__ == '__main__':
    x = input("Enter x: "))
    print("f(x): " + str(f(x)))
if __name__ == '__main__':
    unittest.main()