代码的执行顺序

时间:2018-05-15 15:06:20

标签: python tdd

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

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?提前谢谢!

2 个答案:

答案 0 :(得分:1)

函数(以及扩展名,方法)中的代码在调用之前不会执行。函数中的名称仅然后取消引用。

名称var是全局名称,每次引用时都会被查找。如果Python没有,你永远不会使用全局作为变量,你将无法在程序执行时更改它们的值。

脚本末尾的unittest.main()调用 (最终)调用test_one()方法,因此{em}必须存在{em} >至少那一点。

明确:

  • 使用var声明函数只会触发创建一个函数对象,然后将该对象赋值给一个新名称({{1后面的名称)关键字)。您需要实际调用函数以使其中的代码运行。

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

这意味着您的脚本中会发生以下情况:

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

答案 1 :(得分:0)

它将首先在一个传递中读取最外面的范围(非缩进线),从上到下意味着如果你定义var,定义一个使用var的类,然后在实例化类的时候删除var(大概是在你的主要区块)var不再可用。

我不确定为什么你需要删除var但是如果必须这样做,那么最好在unittest.main()缩进同一块之后进行