2012-05-16 13 views
7

próbuję przypisać Żaden z kluczem w dict, ale otrzymuję TypeError:Przypisywanie NoneType do DICT

self._rooms[g[0]] = None 
TypeError: 'NoneType' object does not support item assignment 

Mój kod jest tutaj:

r = open(filename, 'rU') 
    for line in r: 
     g = line.strip().split(',') 
     if len(g) > 1: 
      r1 = g[0] 
      h = Guest(g[1], str2date(g[2]), str2date(g[3])) 
      self._rooms.set_guest(r1, h) 
     else: 
      self._rooms[g[0]] = None 
    r.close() 

Zanim to pozwolić ja przypisać, ale nie będzie. To dziwne:/

+0

Ładne pytanie +1, zadałeś jednoznaczne pytanie, podałeś nam fragment kodu bez zalania nas i dałeś nam jasny zwrot pieniędzy! –

+0

Wygląda to bardzo podobnie do tego postu wczoraj, http://stackoverflow.com/questions/10600746/python-loading-file-dictionary. Czy to jest problem domowy? – Kafonek

+0

Należy również zachować ostrożność. Stackoverflow nie nadaje się do edycji kodu Pythona - Twoje wcięcie między pierwszymi dwoma liniami nie jest całkiem poprawne;) - Jeśli dostałem nickle za każdym razem, gdy moje wcięcie w python było źle na SO, prawdopodobnie miałbym kilka dolarów przez teraz ... – mgilson

Odpowiedz

8

Wyjątkiem wyraźnie stwierdza TypeError: 'NoneType' object does not support item assignment sugeruje to, że self._rooms jest rzeczywiście None

Edit: Jak powiedziałeś sobie

self._rooms = {} 

lub

self._rooms = dict() 

Zrobi co musisz wyczyścić dyktę

+1

Lub bardziej prawdopodobne, 'self._rooms [g [0]]', ponieważ nie było obiektu "" NoneType "jest unsubscribable" Podniesiono TypeError. – chepner

+3

Spróbuj 'Brak [3] = 4' W swoim tłumaczu dostaniesz dokładnie ten sam wyjątek ^^ –

+1

Ah, to prawdopodobnie to. – Unistudent

0

Prawdopodobnie narzeka na self._rooms, co do którego podejrzewam, że jest None.

0

Sprawdź, czy self._rooms nie jest None.

Przypisywanie None jako wartość do Klucz dict „s faktycznie działa:

In [1]: dict(a=None) 
Out[1]: {'a': None} 
1

Czytając komentarze do Jakob, wnoszę, że winowajcą jest ta linia (nie napisali)

d = self._rooms 
self._rooms = d.clear() 

d.clear() wyczyści słownik d (i self._rooms) w miejscu i zwróci None. Tak więc, wszystkie powiedziane, że zrobione, d jest pustym słownikiem, a self._rooms jest None.

Najczystsze Rozwiązaniem tego problemu jest:

self._rooms.clear() #No need for assignment here! 

zwłaszcza self._rooms wydaje się być dziedziczone z dict - więc może mieć inne atrybuty, które nie chcą stracić, wykonując:

self._rooms={} #Now this is just a dict, no longer has `set_guest` method!