2012-10-14 4 views
-1

Possible en double:
How do I parse a string representing a nested list into an actual list?Créer une liste à partir d'une chaîne représentant une liste

Comment pourrais-je obtenir une liste des erreurs de cette chaîne?

>>> out = "<class 'api.exceptions.DataError'>:[u'Error 1', u'Another error']" 

J'ai essayé d'utiliser le module json mais cela n'a pas fonctionné.

>>> import json 
>>> errors = out.split(":")[-1] 
>>> my_list = json.loads(errors) 

Je reçois cette exception:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/json/__init__.py", line 326, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.7/json/decoder.py", line 366, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 

Voulez-vous s'il vous plaît suggérer un moyen de régler le code pour obtenir ce que je veux?

Édition: ajout du cas d'utilisation.

Le contexte où ma question se pose est la suivante:

try: 
    # some code generating an xmlrpclib.Fault exception 
    pass 
except xmlrpclib.Fault, err: 
    # here print dir(err) gives: 
    # ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', 
    # '__getattribute__', '__getitem__', '__getslice__', '__hash__', '__init__', 
    # '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', 
    # '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', 
    # '__unicode__', '__weakref__', 'args', 'faultCode', 'faultString', 'message'] 

    exit(err.faultString) 
    # exits with: "<class 'api.exceptions.DataError'>:[u'Error 1', u'Another error']" 
+1

Pourquoi ne pas accéder à l'attribut de l'exception qui contient la liste? –

+0

Je l'ai fait, mais pour la façon dont fonctionnent les objets xmlrpclib Fault, je ne pense pas que ce soit possible (ou peut-être que c'est le cas et je ne sais pas comment le faire). http://docs.python.org/library/xmlrpclib.html#fault-objects. – Paolo

Répondre

4

Vous devez utiliser:

import ast 

ls="['a','b','c']" 

ast.literal_eval(ls) 
Out[178]: ['a', 'b', 'c'] 

ou en plein:

In [195]: ast.literal_eval(out.split(':')[1]) 
Out[195]: [u'Error 1', u'Another error'] 
+0

La solution que je cherchais, merci. Disponible depuis 2.6. – Paolo

1

On dirait que vous avez essayé d'imprimer une exception; vous pouvez accéder aux arguments des de l'exception avec le paramètre .args:

print exc.args[0] 
+0

Dans mon cas 'exc.args' est un tuple vide. – Paolo

+0

@Guandalino: L'exception pourrait être l'ignorance des conventions. Faites un 'print dir (exc)' pour détecter les attributs qu'il * a *, ou montrez-nous l'exception réelle plutôt qu'un exemple de nom de module. –

Questions connexes