0

嗨,我正在做一个关于测试的 udacity 课程,我不明白为什么我会在全局变量中遇到这个问题。

问题是我想测试一些队列的实现。为此,我使用断言用后置条件 [empty, full,enqueue,dequeue] 包装方法,然后使用包装的函数对结构进行随机测试以自动化测试。

对于断言,我需要跟踪队列的最大项目(大小)和实际项目(elts),所以我在函数 test() 中将它们定义为本地人。

在 test() 中我定义了包装器,在包装器中我使用了 size 和 elts。

我不明白的是,如果我在包装器定义中使 elts 成为全局,那么我得到一个 NameError 全局名称“elts”未在包装器中定义但是如果我没有在包装器中将其声明为全局,那么我得到 UnboundLocalError 访问elts 在为其赋值之前。

我不明白为什么在“父亲”函数的主体中声明的“儿子”函数不能看到父亲的局部变量并使用它。

这是代码

from queue_test import *
import random
import sys

def test():
    # Globals
    iters=100
    max_int=sys.maxint
    min_int=1
    elts=0
    size=0

    #Queue wrappers 
    # Wrapp the queue methods to include the assertions for automated testing
    def run_empty():
        temp=q.empty()
        if elts==0:
            assert temp==True
        else:
            assert temp==False
        return temp
    def run_full():
        temp=q.full()
        if elts==size:
            assert temp==True
        else:
            assert temp==False
        return temp
    def run_enqueue(val):
        temp=q.enqueue(val)
        if isinstance(val,int) and elts<size:
            elts+=1
            assert temp==True
        else:
            assert temp==False
        return temp
    def run_dequeue():
        temp=q.dequeue()
        if elts>0:
            elts-=1
            assert temp!=None and isinstance(temp,int)
        else:
            assert temp==None
        return temp

    # Random testing stuff
    def get_int(): # Return a random valid integer
        return random.randint(min_int,max_int)
    def get_command(): #Return a random valid command (string)
        return random.choice(["empty","full","enqueue","dequeue"])
    def run_random_command(): # Execute a random command
        c=get_command()
        if c=="empty":
            run_empty()
        elif c=="full":
            run_full()
        elif c=="enqueue":
            run_enqueue(get_int())
        elif c=="dequeue":
            run_dequeue()
        else:
            raise Exception("Error run command invalid command")
    def test_this(ncommands=100): # Randomly test a queue with ncommands commands
        run_empty()
        testi=get_int()
        run_enqueue(testi)
        testi2=run_dequeue()
        assert testi == testi2
        for c in range(ncommands):
            run_random_command()

    #Test Code: Do it random tests each one with a diferent random queue 
    for it in range(iters):
        size=get_int()
        elts=0
        q=Queue(size)
        test_this()
4

1 回答 1

3

如果您在函数中分配给变量,Python 会自动将其设为本地变量。您需要将它们显式标记为global在子函数中。(在 Python 3 中,您可以使用nonlocal它。)

但是,我不禁想到你真的应该在这里使用一个类。

于 2013-07-11T17:23:54.550 回答