Python ‘si x es Ninguno’ no captura NingunoTipo

El siguiente fragmento de código sigue devolviendo el error “Ninguno el tipo no es iterable”. ¿Por qué la sentencia if no capta esto?

inset = set() for x in node.contacted: print type(x) if x.is_converted() is True: nset.add(x) if x.contacted is None: memotable[node.gen][node.genind] = nset else: nset.union(self.legacy(x, memotable)) memotable[node.gen][node.genind] = nset 

Traceback completo según lo solicitado:

Rastreo (llamadas recientes más última):

Archivo “F: \ Dropbox \ CS \ a4 \ skeleton \ trialtest.py”, línea 142, en test_legacy_and_frac ()

Archivo “F: \ Dropbox \ CS \ a4 \ skeleton \ trialtest.py”, línea 125, en test_legacy_and_frac cunittest2.assert_equals (set ([n10, n12, n21]), t.legacy (n00, mtable)

Archivo “F: \ Dropbox \ CS \ a4 \ skeleton \ trial.py”, línea 138, en nset.union legado (self.legacy (x, memotable))

Archivo “F: \ Dropbox \ CS \ a4 \ skeleton \ trial.py”, línea 138, en nset.union legado (self.legacy (x, memotable))

TypeError: el objeto ‘NoneType’ no es iterable

La sentencia if garantiza que x.contacted no es None.

Pero x.contacted no es lo que intentas iterar o indexar, así que no está protegiendo nada.

No hay ninguna razón para que memotable o memotable[node.gen] no pueda ser None aunque x.contacted sea ​​otra cosa. De hecho, no tenemos idea de lo que hace el código dentro de self.legacy(x, memotable) ; tal vez intente iterar x u other_table[x] , o quién sabe qué, cualquiera de los cuales podría ser None .

Esta es la razón por la que necesita ver el rastreo completo, no solo la cadena de error. Le dirá exactamente qué statement falló y por qué.


Y ahora que has pegado el traceback:

 File "F:\Dropbox\CS\a4\skeleton\trial.py", line 138, in legacy nset.union(self.legacy(x, memotable)) 

Sí, es algo que sucede dentro de esa línea de self.legacy , y no tiene absolutamente nada que ver con x.contacted . El problema es casi seguro que su método de self.legacy está devolviendo None , por lo que está haciendo nset.union(None) .

Nuevamente, si x.contacted es o no es None es completamente irrelevante aquí, por lo que su cheque no lo protege aquí.

Si desea que corrijamos el problema en esa función, tendrá que proporcionarnos el código de esa función, en lugar de un código que no tenga nada que ver con el error. Tal vez sea algo tonto, como hacer a + b lugar de return a + b al final, o tal vez sea un error lógico profundo, pero no hay forma de que podamos adivinarlo.

Verifique el valor de memotable y memotable[node.gen] ya que no se puede decir que garantice que no sean Ninguno si x.contacted no es Ninguno (sin el código).

Si menciona los valores de las variables aquí y publica el seguimiento completo, es posible que podamos señalar el problema con mayor precisión.

La excepción se produce porque la función call self.legacy(x, memotable) devuelve None .

El rastreo indica que el error se produce en nset.union(self.legacy(x, memotable)) , y set.union() genera esa excepción cuando su argumento es None . (Supongo que nset es un set . Su código define inset = set() , pero no muestra de dónde proviene nset )

 >>> set().union(None) Traceback (most recent call last): File "", line 1, in  TypeError: 'NoneType' object is not iterable