2013-11-28 10 views
6

Czy mogę przekonwertować ciąg na listę argumentów w pythonie?python konwertuje ciąg na listę argumentów

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) 

wiem:

lista może po prostu użyć * listy, ale lista nie może mieć element takiego: a = 2

i eval może jedynie oceny ekspresji

który byłoby jak:

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

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

Coś takiego jak [argparse] (http://docs.pythser.org/dev/library/argparse.html#argparse.ArgumentParser.parse_args) powinno to zrobić. spójrz, jak wywołać 'parse_args()' z argumentami. –

Odpowiedz

8

Można zmasakrować ciąg wejściowy do słownika, a następnie wywołać funkcję za pomocą tego, np.

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

Najpierw widziałem tę składnię. Dziękuję Ci. Nie wiem dlaczego 'tuple (e.split ('=')) dla e in x.split (',')' spowoduje błąd składni, czy to nie jest argument dict()? Czy istnieje wyjaśnienie tej zasady? –

+0

@AylwynLake: Jest to [wyrażenie generujące] (http://www.python.org/dev/peps/pep-0289/), które z kolei jest uogólnioną formą [list understand] (http: // docs. python.org/2/tutorial/datastructures.html#list-comprehensions). –

7

chcesz słownika , a nie "lista argumentów". Ty też byłoby lepiej wyłączyć za pomocą ast.literal_eval() ocenić zaledwie Python literałów:

from ast import literal_eval 

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

Zanim pójdziesz tą drogą, upewnij się, że zbadane inne opcje dla zestawiania opcji pierwszej, jak argparse dla opcji wiersza polecenia lub JSON dla transferu sieciowego lub opartego na plikach lub utrwalania.

+1

+1, ale to rozwiązanie może nie mieć zastosowania w przypadku, gdy łańcuch "a = 2, b = 3" jest wprowadzany przez użytkownika (np. Z pliku konfiguracyjnego lub podobnego); wolisz nie pozwalać na ocenę dowolnego kodu Pythona. : -} –

+0

@FrerichRaabe: OP zdawał się szukać odpowiednika "argumentów" (1, 2, 3) "' i 'func2 (* literal_eval (args)) tutaj; na przykład coś, co wygeneruje odpowiednią strukturę pythonową do zastosowania w wywołaniu. –

+0

@MartijnPieters: Mam na myśli, jak powiedział Frerich Raabe. Chcę odczytać z pliku konfiguracyjnego tabel, a następnie użyć sqlalchemy do automatycznego generowania tabel. podczas przetwarzania kolumny ('id', Integer, primary_key = True). Następnie zadaj to pytanie. –

0

można wykorzystywać jako ciąg listy argumentów bezpośrednio w wywołaniu eval, np

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

s='a=2, b=3' 

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

nuta że func musi być w przestrzeni nazw za wywołanie eval pracować w ten sposób.