你好我正在做一个测试的udacity课程,我不明白为什么我用全局变量来解决这个问题。
事情是我想要测试的队列的一些实现。为此,我使用断言使用post条件[empty,full,enqueue,dequeue]包装方法,然后继续使用包装函数对结构进行随机测试以自动化测试。
对于断言,我需要跟踪队列的最大项目(大小)和实际项目(elts),所以我在函数test()中将它们定义为locals。
在test()中我定义了包装器,在包装器中我使用size和elts。
我不明白的是,如果我在包装器定义中创建elts全局,那么我得到一个NameError全局名称'elts'没有在包装器中定义但是如果我不在包装器中声明它是全局的那么我得到了在为其分配值之前访问elts的UnboundLocalError。
我不明白为什么在“父”函数的主体中声明的“Son”函数无法看到父亲的局部变量并使用它。
这是代码
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()
答案 0 :(得分:3)
如果您为函数中的变量赋值,Python会自动将其设置为本地变量。您需要在子函数中将它们明确标记为global
。 (在Python 3中,您可以使用nonlocal
。)
但是,我不禁想到你应该在这里使用一个班级。