2012-05-16 20 views
7

que estoy tratando de asignar Ninguno para una llave en un diccionario, pero estoy recibiendo un TypeError:Asignación NoneType a dict

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

Mi código está aquí:

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

Antes de que dejaría yo asigno, pero no lo hará. Es extraño:/

+0

¡La buena pregunta +1, usted hizo una pregunta clara, nos dio un fragmento de código sin inundarnos y nos dio una trazabilidad clara! –

+0

Esto se ve notablemente similar a esta publicación de ayer, http://stackoverflow.com/questions/10600746/python-loading-file-dictionary. ¿Es esto un problema de tarea? – Kafonek

+0

Además, tenga cuidado aquí. Stackoverflow no es bueno para editar el código de Python - Tu sangría entre las dos primeras líneas no es del todo correcta;) - Si recibiera un nickle por cada vez que mi sangría python fuera incorrecta en SO, probablemente tendría un par de dólares por ahora ... – mgilson

Respuesta

8

La excepción establece claramente TypeError: 'NoneType' object does not support item assignment esto sugiere que self._rooms es en realidad None

Editar: Como usted mismo ha dicho

self._rooms = {} 

o

self._rooms = dict() 

va a hacer lo necesita borrar el dict

+1

O, más probablemente, 'self._rooms [g [0]]', ya que no había ningún objeto "NoneType" no se puede suscribir "TypeError raised. – chepner

+3

Pruebe 'Ninguno [3] = 4' En su intérprete obtendrá exactamente la misma excepción ^^ –

+1

Ah, eso es probablemente. – Unistudent

0

Probablemente se esté quejando por self._rooms, que sospecho que es None.

0

Compruebe que self._rooms no es None.

Asignación None como un valor de clave de un dict 's realmente funciona:

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

De la lectura de sus comentarios a Jakob, tengo entendido que el culpable es esta línea (no publicado)

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

d.clear() borrará el diccionario d (y self._rooms) y devolverá None. Por lo tanto, todo dicho y hecho, d es un diccionario vacío y self._rooms es None.

La solución más limpia a esto es:

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

especialmente desde self._rooms parece haber heredado de dict - por lo que pueden tener otros atributos que no desea perder haciendo:

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