2 votes

Impossible d'utiliser collections.defaultdict() dans google-app-engine

J'essaie d'utiliser collections.defaultdict() pour créer un histogramme dans google-app-engine :

class myDS(ndb.Model):

    values = ndb.PickleProperty()
    hist = ndb.PickleProperty()

class Handler:
    my_ds = myDS()
    my_ds.values = {}   
    my_ds.hist = defaultdict(lambda : 0) 

Et j'ai obtenu l'erreur (du journal)

File "/base/alloc/tmpfs/dynamic_runtimes/python27/277b61042b697c7a_unzipped/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1331, in call
    newvalue = method(self, value)
  File "/base/alloc/tmpfs/dynamic_runtimes/python27/277b61042b697c7a_unzipped/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1862, in _to_base_type
    return pickle.dumps(value, pickle.HIGHEST_PROTOCOL)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

Y a-t-il un moyen de résoudre ce problème ?

2voto

blueCat Points 1422

Un champ PickleProperty requiert une valeur qui est sérialisable à l'aide du protocole pickle de Python (cf. docs pour plus d'informations) :

PickleProperty : La valeur est un objet Python (tel qu'une liste, un dict ou une chaîne de caractères) qui est sérialisable à l'aide du protocole Pickle de Python. string) qui est sérialisable à l'aide du protocole Pickle de Python ; Cloud Datastore stocke la sérialisation pickle sous la forme d'un blob. Non indexé par par défaut. Argument de mot-clé facultatif : compressé.

Voir aussi réponse de Martijn Pieters :

Pickle ne peut pas gérer les lambdas ; Pickle ne gère que des données, pas du code, et les lambdas contiennent du code. Les fonctions peuvent être décapées, mais tout comme les les définitions de classes, seulement si la fonction peut être importée. Une fonction définie au niveau du module peut être importée. Pickle stocke juste une chaîne chaîne de caractères dans ce cas, le "chemin" complet de la fonction qui sera importée et référencée lors d'un nouveau déclic.

Il existe plusieurs façons de travailler avec les valeurs par défaut, en fonction de votre cas d'utilisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X