2017-07-22 4 views
0

ast.literal_eval funktioniert gut Pythons eingebauten Typen zur Bewertung:`ast.literal_eval` Äquivalent für Objekte benutzerdefinierte Klasse?

In [42]: import ast 

In [43]: ast.literal_eval('[1, 2, 3, "4", None, (5, 4, 3)]') 
Out[43]: [1, 2, 3, '4', None, (5, 4, 3)] 

Es ist für benutzerdefinierte Klasse Objekte versagt:

In [44]: class Foo(): 
    ...:  def __init__(self, val): 
    ...:   self.val = val 
    ...: 

In [45]: ast.literal_eval('[Foo(1), Foo(2), Foo(3)]') 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-47-a3bd4f494d5d> in <module>() 
----> 1 ast.literal_eval('[Foo(1), Foo(2), Foo(3)]') 

Aber eval funktioniert gut:

In [46]: eval('[Foo(1), Foo(2), Foo(3)]') 
Out[46]: 
[<__main__.Foo at 0x107e13940>, 
<__main__.Foo at 0x107e131d0>, 
<__main__.Foo at 0x107e13160>] 

Wie kann ich kombinieren die Sicherheit von ast.literal_eval mit der Funktionalität von eval für benutzerdefiniertes Objekt s?

Ich habe bei this gesucht, aber dies bezieht sich auf Variablen, die bereits vorhanden sind.

+1

Funktionsaufrufe sind keine * Literale *. Eine wörtliche ist ein * Stringliteral * ein * Ganzzahlliteral * 'true',' false', 'None', * Liste wörtliche *, * Tupel wörtliche *, * gesetzt wörtliche * und * Wörterbuch wörtliche *. –

+0

z.B. 'ast.literal_eval ('dict()')' schlägt ebenfalls fehl. Da Sie in Ihrem Code "dict (..)" überschrieben haben könnten. Alle Anrufe - unabhängig davon, ob diese eingebaut sind oder nicht - werden fehlschlagen. –

+0

@WillemVanOnsem Unterm Strich also, gibt es keine Lösung? –

Antwort

0

, wenn Ihre Daten wie das war -

'["Foo(1)", "Foo(2)", "Foo(3)"]' 

literal_eval würde gearbeitet haben. Weil es würde denken, dass Foo (1) und andere Saiten sind und sie erkennen würde.

Soweit ich weiß, kann dies nicht als Argument in literal_eval verwendet werden.

Von docs,

bewerten sicher einen Ausdruck Knoten oder eine Zeichenfolge ein Literal oder Python Behälter Anzeige enthält. Die angegebene Zeichenfolge oder der Knoten darf nur aus den folgenden Python-Literalstrukturen bestehen: Strings, Bytes, Zahlen, Tupel, Listen, Dicts, Sets, Booleans und None.

Verwandte Themen