2012-05-16 20 views
7

sto cercando di assegnare Nessuno per una chiave in un dizionario, ma sto ottenendo un TypeError:Assegnazione NoneType a dict

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

Il mio codice è qui:

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() 

Prima che avrebbe permesso mi assegno, ma non lo farò. È strano:/

+0

Bella domanda +1, hai posto una domanda chiara, ci ha fornito uno snippet di codice senza inondarci e ci ha dato una chiara traccia! –

+0

Questo aspetto è molto simile a questo post ieri, http://stackoverflow.com/questions/10600746/python-loading-file-dictionary. Questo è un problema di compiti a casa? – Kafonek

+0

Inoltre, fai attenzione qui. StackOverflow non è bello per modificare il codice Python - La tua indentazione tra le prime due righe non è del tutto corretta;) - Se avessi un nickle per ogni volta che il mio rientro di python era sbagliato su SO, probabilmente avrei avuto un paio di dollari per ora ... – mgilson

risposta

8

L'eccezione afferma chiaramente TypeError: 'NoneType' object does not support item assignment questo suggerisce che self._rooms è in realtà None

Edit: Come hai detto tu stesso

self._rooms = {} 

o

self._rooms = dict() 

Farà quello che è necessario cancellare il dict

+1

O più probabilmente, 'self._rooms [g [0]]', dato che non c'era nessun oggetto "'NoneType' è cancellabile" TipoError sollevato. – chepner

+3

Prova 'None [3] = 4' Nel tuo interprete otterrai esattamente la stessa eccezione ^^ –

+1

Ah, questo è probabilmente. – Unistudent

0

Probabilmente si sta lamentando di self._rooms, che sospetto sia None.

0

Verificare che self._rooms non sia None.

Assegnazione None come valore di chiave di s' un dict effettivamente funziona:

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

Da leggere i vostri commenti a Jakob, ho capito che il colpevole è questa linea (non pubblicato)

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

d.clear() cancellerà il dizionario d (e self._rooms) sul posto e restituirà None. Quindi, tutto sommato, d è un dizionario vuoto e self._rooms è None.

la soluzione più pulita a questo è:

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

soprattutto perché self._rooms sembra aver ereditato da dict - quindi potrebbe avere altri attributi che non si desidera perdere facendo:

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