2017-02-15 2 views
2

Так что я получил этот код:класс Python непреднамеренное одноточечно

# The Headers class is like a dictionary but is able to store multiple name-value pairs with the same name 
class Headers: 
    def __init__(self, index = []): 
     self.index = index 

    def __contains__(self, name): 
     for own_name, value in self.index: 
      if name.lower() == own_name.lower(): 
       return True 
     return False 

    def __getitem__(self, name): 
     for i in range(len(self.index)): 
      if name.lower() == self.index[i][0].lower(): 
       return self.index[i][1] 

    def __iter__(self): 
     return HeadersIterator(self) 

    def __setitem__(self, name, value): 
     for i in range(len(self.index)): 
      if name.lower() == self.index[i][0].lower(): 
       self.index[i][1] = value 

    def add(self, name, value): 
     self.index.append((name, value)) 

class HeadersIterator: 
    def __init__(self, headers, index = 0): 
     self.headers = headers 
     self.index = index 

    def __next__(self): 
     if self.index >= len(self.headers.index): 
      raise StopIteration() 

     result = self.headers.index[ self.index ] 
     self.index += 1 

     return result 

Я просто иметь эту проблему с ним, что, когда я пытаюсь использовать его, он, кажется, действует, как будто это где одноэлементно. Вот какой-то другой код, который показывает, что я использую его:

def headers(self): 
     hs = Headers() 
     print("huh?", Headers, hs.index,) 

     # Most headers start with HTTP_ 
     for name, value in self.environ.items(): 
      if name.startswith('HTTP_'): 
       parts = [ (x[0].upper() + x[1:].lower()) for x in name[ len('HTTP_') : ].split('_') ] 

       hs.add('-'.join(parts), value) 

     # Some don't 
     if 'CONTENT_LENGTH' in self.environ: 
      hs.add('Content-Length', str(self.environ['CONTENT_LENGTH'])) 

     return hs 

Теперь, кажется, что второй раз он печатает «да?» line, кажется, что переменная hs указывает на тот же объект Headers, что означает, что он будет продолжать добавлять к той же переменной Headers, которую он возвращает, имея еще больше записей в следующий раз. Любая помощь очень ценится!

+0

Нет, список всегда один и тот же. –

+0

Возможно, это связано с этим: 'index = []):'. Я знаю, что использование дефолтного списка может вызвать проблемы, поскольку они изменяемы. – Carcigenicate

+0

@JacquesdeHooge: Я не уверен, что это решит что-либо, потому что в этом случае ** ссылка на [[] [:] 'будет скопирована ** ... –

ответ

2

Header сама не одноэлементно, но они относятся все к же index. Это связано с конструктором:

def __init__(self, index= []): 
    # ...

Это означает, что Python строит один список и для каждого вызова конструктора без данного index, ссылка на тот же список дается.

Вы можете решить, передав непреложным (например None), а затем использовать if заявление и построить новый список, как:

def __init__(self, index= None): 
    if index is None: 
     index = [] 
    # ...

Хотя есть определенно ситуации, в которых полезно пройти глобальный ссылку на конструктор (как вы это делаете здесь), рекомендуется с осторожностью использовать изменяемые объекты в качестве параметров по умолчанию: всегда рассматривайте передачу неизменяемых (например, 42, None, 'foobar', True, (), ...).

+1

Ах, спасибо, я уже заметил, проблема перестала существовать, когда я удалил параметр по умолчанию. Теперь я знаю, почему. Благодарю. –

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