嗨,我正在做一个关于测试的 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()