【问题标题】:Why doesn't IDLE need 'if __name__ == "__main__": to run a test case, but PyCharm does?为什么 IDLE 不需要 'if __name__ == "__main__": 来运行测试用例,但 PyCharm 需要?
【发布时间】:2017-06-10 02:07:34
【问题描述】:

我正在练习使用 unittest,我在 PyCharm 中尝试了以下操作:

import unittest
from format_name import name_formatted

class TestName_formatted(unittest.TestCase):
    """practice with unittest"""

    def test_name(self):
        """Testing name_formatted function"""
        formatted_name = name_formatted("mike", "Cronin")
        self.assertEqual(formatted_name, "mike Cronin")

unittest.main()

经过研究,看到是这样写的:

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

突然间它完美地工作了。然而,我这样写的原因,没有 if 语句,是因为这就是我从“Python Crash Course”中学到的,它使用 GEANY 和 IDLE 作为示例代码。果然,在这两个程序中,您都不需要 if 语句。

为什么在一个 IDE 中代码不起作用而在其他 IDE 中却起作用?

【问题讨论】:

  • 这完全取决于测试运行器在 IDE 中的设置方式。
  • if __name__ == "__main__": 无论如何都是最佳实践:这意味着您的代码可以在不运行的情况下导入。一些分析工具需要这种能力才能发挥作用,而且在任何情况下都非常有用。
  • @NickA 是 PEP8 要求的 if __name__ == "__main__":
  • 顺便说一句,这个问题目前没有描述你做出改变之前发生了什么,并且事情“突然完美地工作”。这是相关的 - 例如,如果您有重复执行正在发生或被尝试,这与错误的性质完全一致。
  • 我一次运行一个程序,唯一改变的是单行(和缩进),但是哇,我不知道这可能是一件事。因此,如果我运行 IDLE 和 Pycharm,并且都让它们同时从同一个文件中导入,那会影响事情吗?很高兴知道

标签: python unit-testing main


【解决方案1】:

您正在 PyCharm 中运行代码,就好像它是一个普通的 Python 应用程序一样;这就是为什么你需要 if __name__ == '__main__' 条件。这也是编写可以在命令行中导入或运行的模块(文件)时的最佳实践——单元测试就是这种情况。

PyCharm 基本上是在尝试做python your_file_name.py

IDLE 不需要这个的原因是因为 IDLE 通过首先在 Python shell 中加载文件来运行应用程序。

IDLE 正在做的是:

python
>>> import your_file_name

通过这样做,代码被自动评估,函数被调用,从而测试运行。

我还建议阅读PyCharm's manual 中的测试文档,因为 PyCharm 广泛支持测试。在该链接中,您还会注意到示例测试用例的默认存根(或模板)已经具有 if __name__ == '__main__' 检查:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多