Domanda

Sto ricevendo errori Unicode mentre provo ad aggiungere dati a NEO4J tramite lampadine quando i dati contengono dati non ASCII.

Il seguente codice fallisce:

from bulbs.model import Node
from bulbs.property import String
from bulbs.neo4jserver import Graph

class User(Node):
    element_type="user"
    name = String(nullable=False)

g = Graph()
g.add_proxy("users", User)

user_data = {u'name': u'Aname M\xf6ller'}

g.users.create(**user_data)

con un UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 7: ordinal not in range(128)

L'errore si sta verificando in bulbs.utils.u funzione, via codecs.unicode_escape_decode().

Alcune informazioni pertinenti, si spera,:

$>python -V
'2.7.3'

>>>type(user_data['name'])
type('unicode')

>>>import bulbs
>>>bulbs.__version__
'0.3'

I documenti neo4j stato Che tutti gli oggetti stringa vengono salvati come Unicode, quindi perché i miei dati Unicode non vengono accettati? Spero di aver perso qualcosa di sciocco.

È stato utile?

Soluzione

Sì, questo era un bug. È fisso in lampadine 0.3.23:

https://github.com/espeed/bulbs/commit/7f104cdbc30f27ea76b036cfa0d0a694f074153e

Altri suggerimenti

Dopo essermi rinfrescato su Python e Unicode, ho aggirato il problema, anche se solo avvolgendo la mia linea di problema con un tentativo, cattura e quindi codificando i dati del problema su "UTF-8". Non è la soluzione più elegante, ma il seguente codice sembra funzionare per me.

from bulbs.model import Node
from bulbs.property import String
from bulbs.neo4jserver import Graph

class User(Node):
    element_type="user"
    name = String(nullable=False)

g = Graph()
g.add_proxy("users", User)

user_data = {u'name': u'Aname M\xf6ller'}

try:
    g.users.create(**user_data)
except UnicodeEncodeError:
    for k, v in user_data.iteritems():
        try:
            user_data[k] = unicode.encode(v, 'utf-8')
        except TypeError:
            # Fails for non string values
            pass
    g.users.create(**user_data)

L'unico problema che ho con questo. Se la bulbs Logger è attivo, quindi l'errore MSG con un traceback viene registrato sulla prima chiamata a create(). Non è un affare, solo un po 'fastidioso.

Non hai provato questo su Python 3, qualcuno ha qualcosa in cui interrompere la questione?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top