Python 包含输入/输出的导入模块
我有一个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,则可以重
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。使用sox=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()