2014-01-11 3 views
4

Я создаю очень простой объект-контейнер в python, и одна из его функций требует создания временного нулевого класса-заполнителя, который абсолютно ничего не делает, кроме как сообщить программе, что удалить.Ошибка Python, создающая экземпляр объекта внутри другого

class __cyclepass(object): 
    "Null class as a placeholder for deleting items in a cycle.""" 
    pass 

class Cycle(object): 

    def __init__(self, *args): 
     self.l = list(args) 

    #......................... 

    def __delitem__(self, key): 
     """Magic method for deleting items via indexing.""" 
     try: 
      if isinstance(key, slice): 
       s = key.start; e = key.stop; stp = key.step if key.step else 1 
       slicelen = abs((s - e) // stp) 
       if slicelen == 1: 
        steps = [s] 
       else: 
        steps = [s + stp * i for i in range(slicelen)] 
       _list = copy(self.l) 
       for step in steps: 
        index = step % len(self) 
        _list[index] = __cyclepass() #this is where an error occurs 
       self.l = list(filter(lambda x: x.__class__ != __cyclepass, _list)) 
      else: 
       index = key % len(self) 
       del self.l[index] 
     except: 
      raise IndexError("Bad index %s" % str(key)) 

Все кажется отлично (хотя и немного грязный, но это в сторону точки), но при запуске программы и неявным вызовом delitem метод, который я получаю эту ошибку:

NameError: global name '_Cycle__cyclepass' is not defined 

Что на земле будет заставлять его искать _Cycle__cyclepass при создании объекта __cyclepass?

+4

Это результат смены имени пользователя на языке "python". переименуйте из префикса с двойным подчеркиванием на однострочный символ, и проблема решена. – shx2

+0

Хорошо, я изменил его и действительно все исправлено, спасибо за помощь! Почему python делает это и может ли он использоваться в любом практическом смысле? – user3002473

+1

@ shx2 Почему бы вам не опубликовать его как ответ? :) – aIKid

ответ

5

[перемещение мой комментарий к ответу, как это было предложено]

Это результат Питона name mangling «частных» членов. Переименуйте префикс с двойным подчеркиванием на однострочный символ, и проблема решена.

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