2013-07-13 9 views
5

Ho uno strano problema. Ho un metodo che restituisce un valore booleano. A sua volta ho bisogno che il risultato di quella funzione venga nuovamente restituito poiché non posso chiamare direttamente il metodo dal front-end. Qui è il mio codice:TypeError ("'bool' object is not iterable",) quando si tenta di restituire un booleano

# this uses bottle py framework and should return a value to the html front-end 
@get('/create/additive/<name>') 
def createAdditive(name): 
    return pump.createAdditive(name) 



def createAdditive(self, name): 
     additiveInsertQuery = """ INSERT INTO additives 
            SET   name = '""" + name + """'""" 
     try: 
      self.cursor.execute(additiveInsertQuery) 
      self.db.commit() 
      return True 
     except: 
      self.db.rollback() 
      return False 

Questo genera un'eccezione: TypeError (" 'bool' oggetto non è iterabile",)

Non ottengo questo errore a tutti dal momento che non sto cercando di "iterate "il valore bool, solo per restituirlo.

Se restituisco una stringa anziché booleano o int funziona come previsto. Quale potrebbe essere un problema qui?

Traceback:

Traceback (most recent call last): 
    File "C:\Python33\lib\site-packages\bottle.py", line 821, in _cast 
    out = iter(out) 
TypeError: 'bool' object is not iterable 
+2

Invia l'intero traceback per favore. – zhangyangyu

+0

Vedere la modifica per il traceback completo. – DominicM

risposta

8

Guardate la traceback:

Traceback (most recent call last): 
    File "C:\Python33\lib\site-packages\bottle.py", line 821, in _cast 
    out = iter(out) 
TypeError: 'bool' object is not iterable 

Il codice non è l'iterazione il valore, ma il codice che lo riceve è.

La soluzione è: restituire un iterabile. Suggerisco di convertire il bool in una stringa (str(False)) o di racchiuderlo in una tupla ((False,)).

Leggere sempre il traceback: è corretto ed è utile.

+0

Il metodo stringa ha funzionato, ma è molto frustrante in quanto devo controllare che non stringa il bool in front-end. Tulepe non ha funzionato, è questa sintassi corretta? [[[return ((False,))]]]? Inoltre, è comune che i framework con routing richiedano tipi di dati iterabili? Se si tratta di qualcosa di bottle py, passerei a web py ... – DominicM

+1

@DominicM No, non è possibile inserire un'istruzione all'interno di un elenco (o in effetti, tre elenchi). Penso che questo sia un design comune. Se stai cercando di passare dati a XmlHTTPRequest, ti suggerisco di restituire AJAX (usa il modulo 'ajax'), e usare una libreria di analisi ajax sul lato client. – Marcin

+0

Immagino di essere abituato a php essere in grado di tornare semplicemente all'eco vero/falso. Cosa intendi per libreria di analisi ajax? Attualmente sto usando la chiamata javascript/jquery $ .ajax. – DominicM