L'établissement de laquelle un objet peut pas être marinés
Je suis de la réception d'un objet, t
, à partir d'une api de type Object
. Je suis incapable de cornichon, l'obtention de l'erreur:
File "p.py", line 55, in <module>
pickle.dump(t, open('data.pkl', 'wb'))
File "/usr/lib/python2.6/pickle.py", line 1362, in dump
Pickler(file, protocol).dump(obj)
File "/usr/lib/python2.6/pickle.py", line 224, in dump
self.save(obj)
File "/usr/lib/python2.6/pickle.py", line 313, in save
(t.__name__, obj))
pickle.PicklingError: Can't pickle 'Object' object: <Object object at 0xb77b11a0>
Quand je ne les suivants:
for i in dir(t): print(type(i))
Je ne reçois que des objets de chaîne:
<type 'str'>
<type 'str'>
<type 'str'>
...
<type 'str'>
<type 'str'>
<type 'str'>
Comment puis-je imprimer le contenu de mon Object
objet afin de comprendre pourquoi il ne peut pas être marinés?
Il est aussi possible que l'objet contient C les pointeurs de QT objets, auquel cas il ne serait pas logique pour moi de cornichons à l'objet. Mais encore une fois je voudrais voir la structure interne de l'objet afin d'établir cette.
Il semble que ce est quelque chose que vous auriez debug par l'enquête sur le
Object
type lui-même, pas l'instance.dir()
renvoie une liste de chaîne de caractères des noms de variables, et non pas les valeurs des variables elles-mêmes.OriginalL'auteur Baz | 2015-05-28
Vous devez vous connecter pour publier un commentaire.
Vous voudrez peut-être lire le python docs et vérifier votre API
Object
classe par la suite.À l'égard de la "structure interne de l'objet", généralement instance attributs sont stockés dans le
__dict__
attribut (et depuis des attributs de classe ne sont pas marinés vous ne se soucient que l'instance attributs) - mais notez que vous aurez également à inspecter de manière récursive la__dict__
s pour chaque attribut.OriginalL'auteur bruno desthuilliers
Je voudrais utiliser
dill
, qui a les outils pour étudier, qu'à l'intérieur d'un objet entraîne votre objet cible pour ne pas être picklable. Voir cette réponse par un exemple: Bon exemple de BadItem à l'Aneth Module, et ce Q&a pour Un exemple des outils de détection de l'utilisation réelle: les pandas.algos._return_false causes PicklingError avec de l'aneth.dump_session sur CentOS.Cependant, le point de départ commun est d'utiliser
trace
:dill
dispose également de la fonctionnalité de trace des pointeurs des référents et des référents des objets, de sorte que vous pouvez construire une hiérarchie de la façon dont les objets se réfèrent les uns aux autres. Voir: https://github.com/uqfoundation/dill/issues/58Alternativement, il y a aussi: cloudpickle.py et debugpickle.py qui sont, pour la plupart, n'est plus développé. Je suis le
dill
auteur, et espère bientôt fusionner toutes les fonctionnalités de ces codes, ce qui manque àdill
.OriginalL'auteur Mike McKerns
J'ai essayé de l'Aneth, mais il n'a pas expliquer mon problème. Au lieu de cela, j'ai utilisé le code suivant à partir de https://gist.github.com/andresriancho/15b5e226de68a0c2efd0, ce qui s'est passé pour montrer un bug dans mon
__getattribute__
remplacer:Edit: Voici une reproduction de mon code, à l'aide de cornichon et cPickle:
De sortie:
Vous verrez que la raison en est que les noms d'attributs sont déformés par
__getattribute__
dill
n'a pas aidé, mais le code ci-dessus? Le code ci-dessus est une version affaiblie de code qui existe dansdill.detect
. Plus précisément,dill.detect.badobjects
etdill.detect.badtypes
.dill
a aussi d'autres outils qui sont indiqué dans ma réponse. Si il y a quelque chose quidill
manque ici, j'aimerais savoir.Salut @MikeMcKerns. L'aneth se ressemblaient beaucoup, je ne pense pas que vous serez en mesure de code de la stupidité de ma part 🙂 j'ai mis à jour ma question avec une reproduction de mon code bogué.
Ah... ok, vous avez un vrai coin de cas.
dill
ne trouve pas le problème dans le cas, je suis d'accord. Cependant, vous noterez aussi quedebug_pickle
ne fait pas revenir le mauvais attribut... elle n'arrive pas à attraper l'erreur qui provoque le décapage à l'échec. Utile, mais apparemment involontaire. Je vais faire une note de ce cas, comme un billet pourdill
. Merci.github.com/uqfoundation/dill/issues/154
OriginalL'auteur Alastair McCormack
Ici est une extension de Alastair est la solution, en Python 3.
:
est récursive, pour faire face à des objets complexes où le problème peut venir de plusieurs couches de profondeur.
La sortie est de la forme
.x[i].y.z....
pour vous permettre de voir les membres ont été appelés pour obtenir le problème. Avecdict
il imprime juste[key/val type=...]
au lieu de cela, comme des clés ou des valeurs peut être le problème, ce qui rend plus difficile (mais pas impossible) de faire référence à une clé spécifique ou de la valeur dans ledict
.comptes de plus en plus de types, plus précisément
list
,tuple
etdict
, qui doivent être traités séparément, car ils n'ont pas__dict__
attributs.retourne tous les problèmes, plutôt que de simplement la première.
OriginalL'auteur Dukeling