2013-07-11 1 views
0

Привет, я делаю курс 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() 

ответ

3

Если присвоить переменной внутри функции, Python автоматически делает его локальным. Вам нужно будет явно отметить их как global в дочерних функциях. (В Python 3 вы можете использовать .)

Однако я не могу не думать о том, что вы действительно должны использовать класс здесь.

+0

+1 Для того, чтобы сказать, что это действительно должен быть объект. Он также не определяет глобальные глобальные значения, а только значения в пределах функции 'test()'. Все остальное - закрытие, поэтому они взорвутся, когда он попытается изменить значение «elts» внутри любого из них. –

+0

Да, спасибо, парни, я получил это;) оба очень полезны. – Torrezno

 Смежные вопросы

  • Нет связанных вопросов^_^