首页 > 解决方案 > 代码的执行顺序

问题描述

我是编程新手。谁能帮我理解脚本的执行顺序?我有代码:

import unittest

var = 'one'

class FirstTest(unittest.TestCase):
    def test_one(self):
        self.assertEqual(var, 'one')

# del var

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

首先,我需要测试我的变量“var = 'one'”。然后我必须删除这个变量(del var)。不删除var (del var) 测试通过。但是,如果我从范围中删除这个 var ,即使我在执行del var之前放置测试,测试也会被破坏。我收到以下错误:

NameError: name 'var' is not defined

我的代码组织是不可接受的,或者我不理解脚本的执行顺序以及何时涉及测试。那么,我在哪里可以找到任何信息来解决我的问题 - 通过测试然后删除我有价值的 var?提前致谢!

标签: pythontdd

解决方案


函数(以及扩展的方法)中的代码在您调用它们之前不会执行。函数中的名称才会取消引用。

该名称var是一个全局名称,每次您引用它时都会进行查找。如果 Python 不这样做,您将永远无法将全局变量用作变量,您将无法在程序执行时更改它们的值。

(最终)调用该方法的是脚本末尾的unittest.main()调用,因此必须至少存在到该点。test_one()var

明确地说:

  • 声明一个函数def只会触发一个函数对象的创建,然后将该对象分配给一个新名称(def关键字后面的名称)。您需要实际调用该函数才能运行其中的代码。

  • class语句很像函数声明,但类的主体会立即执行以形成类的属性。所以class FirstTest(...): ...执行,然后你有一个FirstTest在你的全局命名空间中命名的新类对象。这包括执行def test_one():内部的声明,test_one然后是FirstTest类的属性。自身内部的代码test_one仍未执行。

这意味着您的脚本中发生的情况是:

  • import unittest被执行;该名称unittest已添加到您的全局变量中
  • var = 'one'被执行,名字var被添加到你的全局变量中
  • class FirstTest被执行,名字FirstTest被添加到你的全局变量中
    • 在执行类体时,将名称test_one添加到类命名空间中,因此类具有test_one属性。
  • 可选:del var执行时,名称从全局变量var删除。
  • 运行测试if。如果为真,则执行表达式unittest.main()unittest是一个现有的全局,main找到属性,并调用所引用的对象unittest.main
  • unittest.main()执行在当前模块中查找所有测试用例的代码,此处为FirstTest. 对于FirstTest以 开头的每个属性test_,将执行调用该属性的测试运行。在这里test_one找到并执行。
    • self.assertEqual(var, 'one')被执行
      • self是一个有效的本地名称,引用测试实例
      • 找到属性assertEqual,解析为对象
      • 名字var被查了。这是一个全球性的,所以它更好地存在!

推荐阅读