2013-11-28 9 views
6

Kann ich eine Zeichenfolge in die Argumentenliste in Python konvertieren?Python konvertiert eine Zeichenfolge in die Argumentenliste

def func(**args): 
    for a in args: 
     print a, args[a] 

func(a=2, b=3) 

# I want the following work like above code 
s='a=2, b=3' 
func(s) 

Ich weiß:

Liste können, verwenden Sie einfach * Liste, aber die Liste kann ein Element haben, wie: a = 2

und eval nur Ausdruck

auswerten kann die wie wäre:

def func2(*args): 
    for a in args: 
     print a 

list1=[1,2,3] 
func2(*list1) 
func2(*eval('1,2,3')) 
+0

So etwas wie [argparse] (http://docs.python.org/dev/library/argparse.html#argparse.ArgumentParser.parse_args) sollte es tun. Sehen Sie sich an, wie man 'parse_args()' mit Argumenten aufruft. –

Antwort

8

Sie können die Eingabezeichenfolge in ein Wörterbuch eingeben und dann Ihre Funktion aufrufen, z.

>>> x='a=2, b=3' 
>>> args = dict(e.split('=') for e in x.split(', ')) 
>>> f(**args) 
a 2 
b 3 
+0

Zuerst sah diese Syntax. Vielen Dank. Ich weiß nicht, warum 'tuple (e.split ('=')) für e in x.split (',')' Syntaxfehler verursacht, ist das nicht ein Argument von dict()? Gibt es eine Erklärung zu dieser Regel? –

+0

@AylwynLake: Es ist ein [Generatorausdruck] (http://www.python.org/dev/peps/pep-0289/), der wiederum eine verallgemeinerte Form von [list comprehensions] ist (http: // docs. python.org/2/tutorial/datastructures.html#list-comprehensions). –

7

Sie ein Wörterbuch wollen, keine "Argumentliste". Sie würden auch besser dran ast.literal_eval() mit nur Python Literale zu bewerten:

from ast import literal_eval 

params = "{'a': 2, 'b': 3}" 
func(**literal_eval(params)) 

Bevor Sie diesen Weg zu gehen, stellen Sie sicher, dass Sie andere Optionen für die Optionen Rangier ersten erkundet haben, wie argparse für Befehlszeilenoptionen oder JSON für netzwerk- oder dateibasierte Übertragung oder Persistenz.

+1

+1, aber diese Lösung ist möglicherweise nicht anwendbar, falls die Zeichenfolge "a = 2, b = 3" Benutzereingabe ist (z. B. aus einer Konfigurationsdatei oder dergleichen); Sie möchten lieber keinen beliebigen Python-Code auswerten. : -} –

+0

@FrelichRaabe: Das OP schien nach dem Äquivalent von 'args '(1, 2, 3) und' func2 (* literal_eval (args)) 'hier zu suchen; z.B. etwas, das die richtige Python-Struktur für den Aufruf erzeugen würde. –

+0

@MartijnPieters: Ich meine, wie Frerich Raabe sagte. Ich möchte aus der Konfigurationsdatei von Tabellen lesen, dann verwenden Sie sqlalchemy, um automatisch Tabellen zu generieren. bei der Verarbeitung der Spalte ('id', Integer, primary_key = True). Dann stelle diese Frage. –

0

Sie können die Zeichenfolge als Argument Liste verwenden, um direkt in einem Aufruf an eval, z.B.

def func(**args): 
for a in args: 
    print(a, args[a]) 

s='a=2, b=3' 

eval('func(' + s + ')') 
>>>b 3 
>>>a 2 

beachten Sie, dass func Bedürfnisse im Namensraum sein, wenn der eval Aufruf wie folgt zu arbeiten.

Verwandte Themen