Привет, я делаю курс udacity по тестированию, и я не понимаю, почему я получаю эту проблему с помощью глобальных переменных.Функция «Сын» не может видеть функцию «Отец» locals
Вещь есть некоторая реализация очереди, которую я хочу протестировать. Для этого я завершаю методы с условиями сообщения [empty, full, enqueue, dequeue] с помощью утверждений, а затем приступайте к произвольному тестированию структуры с помощью завернутых функций для автоматизации тестирования.
Для утверждений мне нужно отслеживать максимальные элементы (размер) очереди и фактических элементов (elts), поэтому я определил их как locals в функции test().
Внутренний тест() Я определяю обертки, и в обертках я использую размер и 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()
+1 Для того, чтобы сказать, что это действительно должен быть объект. Он также не определяет глобальные глобальные значения, а только значения в пределах функции 'test()'. Все остальное - закрытие, поэтому они взорвутся, когда он попытается изменить значение «elts» внутри любого из них. –
Да, спасибо, парни, я получил это;) оба очень полезны. – Torrezno