Comment pickle un namedtuple instance correctement

Je suis en train d'apprendre comment utiliser la saumure. J'ai créé un namedtuple objet, ajouté à une liste, et a essayé de les achards de cette liste. Cependant, j'obtiens l'erreur suivante:

pickle.PicklingError: Can't pickle <class '__main__.P'>: it's not found as __main__.P

J'ai trouvé que si j'ai couru le code sans l'enveloppant à l'intérieur d'une fonction, il fonctionne parfaitement. Est-il une étape supplémentaire nécessaire pour mariner un objet enveloppé à l'intérieur d'une fonction?

Voici mon code:

from collections import namedtuple
import pickle

def pickle_test():
    P = namedtuple("P", "one two three four")
    my_list = []
    abe = P("abraham", "lincoln", "vampire", "hunter")
    my_list.append(abe)
    f = open('abe.pickle', 'w')
    pickle.dump(abe, f)
    f.close()

pickle_test()
  • Malheureusement, pickle ne semble pas bien fonctionner avec namedtuples.
  • pickle poignées namedtuple classes amende; les classes définies dans une fonction d'espace de noms local pas tellement.
  • double possible de Python: ne Peut pas les achards de type X, attribut de recherche a échoué
  • Cette question a été posée/répondu il y a un an 🙂
  • Cela n'affecte pas si c'est un doublon et maintenant, les questions sont liées les unes aux autres dans la barre latérale, ce qui est utile. Le commentaire n'est pas une critique, il est généré automatiquement lors de repérage.
  • Ne vous en faites pas. J'ai juste pensé que c'était drôle. La Question des liens très utiles 🙂
  • Il y a un problème similaire. Si le type de variable et le type de chaîne utilisé dans le constructeur ne sont pas les mêmes alors pickle échouera également. par exemple, P = namedtuple("Q", "one two three four")
  • Pour la postérité: cette erreur se produit également si le typename argument namedtuple ne correspond pas au nom de la classe retournée par namedtuple. Voir: stackoverflow.com/a/28149627/3396951