Tupel-Strings in Tupel von Strings konvertieren

7

Meine Eingabe ist:

%Vor%

Erwartete Ausgabe ist:

%Vor%

Das Iterieren über die Eingabe und die Verwendung von eval / literal_eval für die Tupelzeichenfolgen ist nicht möglich:

%Vor%

Wie kann ich ein Element wie '(var1, )' in ein Tupel konvertieren, in dem die inneren Objekte als Zeichenfolgen anstelle von Variablen behandelt werden?

Gibt es einen einfacheren Weg als einen Parser zu schreiben oder Regex zu verwenden?

    
runDOSrun 02.02.2016, 12:53
quelle

3 Antworten

12

Bei jedem Vorkommen einer Variablen durchsucht eval die Symboltabelle nach dem Namen der Variablen Variable. Es ist möglich, eine benutzerdefinierte Zuordnung bereitzustellen, die den Schlüsselnamen für jeden fehlenden Schlüssel zurückgibt:

%Vor%

Beispiel:

%Vor%

Hinweis: eval kopiert aktuelle globale Elemente in das übermittelte globals -Wörterbuch, wenn es nicht __builtins__ enthält. Das bedeutet, dass der Ausdruck Zugriff auf integrierte Funktionen, Ausnahmen und Konstanten sowie auf Variablen in Ihrem Namespace hat. Sie können versuchen, dies zu lösen, indem Sie FakeNamespace(__builtins__=<None or some other value>) statt nur FakeNamespace() übergeben, aber nicht eval 100% sicher machen ( < em> Python eval: Ist es immer noch gefährlich, wenn ich Buildins deaktiviere und den Zugriff zuweise? )

    
vaultah 02.02.2016, 13:00
quelle
5

Versuchen Sie Folgendes:

%Vor%

Zum Beispiel:

%Vor%

Wir durchlaufen unsere Liste von Tupel-Strings und entfernen für jedes die () s, teilen dann unsere Zeichenfolge in eine Liste mit , und konvertieren unsere Liste dann wieder in ein Tupel. Wir verwenden filter() , um leere Elemente zu entfernen.

    
Will 02.02.2016 12:58
quelle
4

Ich mag vaultahs Lösung. Hier ist eine weitere mit ast.literal_eval und re , wenn eval keine Option ist:

%Vor%     
timgeb 02.02.2016 13:18
quelle

Tags und Links