导入内部测试而不是在模块的开头是不是更pythonic?

Posted

技术标签:

【中文标题】导入内部测试而不是在模块的开头是不是更pythonic?【英文标题】:Is it more pythonic to import inside tests instead of at the start of the module?导入内部测试而不是在模块的开头是否更pythonic? 【发布时间】:2018-10-05 17:16:18 【问题描述】:

“PyCharm 知道在测试中你是在单元测试中而不是在模块开始时进行导入”是来自"Getting Started with PyCharm 7/8: Testing" 视频关于PyCharm 提供的测试功能的引用。

来自PEP8:

导入总是放在文件的顶部,就在任何模块 cmets 和文档字符串之后,模块全局变量和常量之前。

In this other SO question,在 python 中导入到哪里的概念已经被作为一个 broder 概念解决。但是,在单元测试时没有提及特殊情况。

导入内部测试而不是在模块开头导入会有什么好处?

如果不同的测试使用相同的模块,是否每次都要导入模块?

【问题讨论】:

Should import statements always be at the top of a module?的可能重复 @Qback,这个问题的答案都没有谈到单元测试。我认为这个问题在关注这个用例时是相关的。 @Alechan 单元测试时没有提到特殊情况,因为它不是特殊情况。为什么你觉得它很特别? @Goyo 因为在该问题的答案中没有提到它,并且因为测试某物与定义某物的功能不同。 @Alechan 编写一段代码总是不同于编写另一段代码。单元测试在导入方面有何特别之处? 【参考方案1】:

根据this question,最好将import 放在模块的开头。

如果您将import 放在函数的开头import 将仅在此函数内部可用,您将无法在此function 之外使用它。考虑这个例子:

def func():
    import time
    time.sleep(1)

func()
time.sleep(1) # NameError: name 'time' is not defined

此外,如果您将 import 您的模块在函数内,则每次调用函数时都会导入它 as mentioned it this question too。

我认为只有当你真的想在具体情况下测试这个导入时,你才应该将 import 放在 test 中。

【讨论】:

是的,但是这个问题没有提到单元测试。此外,您的最后一个链接应该是提到您所指事物的答案,而不是问题。 @Alechan 刚刚编辑以表明我的观点。 ;) 但我认为 import 测试应该是非常罕见的情况。如果您的代码无法导入某些内容,则可能是安装错误。 我认为原因是只有导入失败的测试才会失败,否则整个模块都会失败并且没有运行测试。我不确定,这就是我在这里问这个问题的原因 @Alechan 是的,这就是我所指出的。如果您打算在具体案例中测试导入,请将import 放在 test case 中。但在大多数情况下,您可以将它放在 module 的开头,因为如果整个模块将失败 doing import 那么您可能安装了错误的代码并且它不应该在全部。在大多数情况下,测试旨在检查您是否正确编写代码,而不是检查您是否安装了每个依赖项。 @Alechan 但是如果例如在首次启动时触发测试以检查您的应用是否可以正确导入所有内容,然后随意测试import ;)

以上是关于导入内部测试而不是在模块的开头是不是更pythonic?的主要内容,如果未能解决你的问题,请参考以下文章

python第十天学习总结

仅在函数中导入模块是否正确,而不是在文件的开头?

导入内部函数是pythonic吗?

Python——模块以及导入注意事项

修改 Python 模块的常见做法

python的下划线