2012-04-15 21 views
5

Niedawno znalazłem bardzo użyteczną funkcję ''.format, ponieważ może ona poprawić czytelność w porównaniu do formatowania %. chce osiągnąć proste formatowanie wyrażenie:Funkcja ".format" Pythona

data = {'year':2012, 'month':'april', 'location': 'q2dm1'} 

year = 2012 
month = 'april' 
location = 'q2dm1' 
a = "year: {year}, month: {month}, location: {location}" 
print a.format(data) 
print a.format(year=year, month=month, location=location) 
print a.format(year, month, location) 

podczas gdy dwa pierwsze odbitki należy formatować jak oczekuję (tak, something=something wygląda brzydko, ale to tylko przykład), ostatni podniosłoby KeyError: 'year'. Czy istnieje jakaś sztuczka w pythonie, aby utworzyć słownik, aby automatycznie wypełniał klucze i wartości, na przykład somefunc(year, month, location) wyświetli {'year':year, 'month': month, 'location': location}?

Jestem całkiem nowy dla Pythona i nie mogłem znaleźć żadnych informacji na ten temat, jednak taka sztuczka poprawiłaby i zmniejszyła mój obecny kod drastycznie.

Z góry dziękuję i przepraszam za mój angielski.

Odpowiedz

6

Pierwszy print powinny być

print a.format(**data) 

Ponadto, jeśli znajdujemy pewne skróty, można napisać jednego podobnego, nie wielka różnica.

def trans(year, month, location): 
    return dict(year=year, month=month, location=location) 
+0

Wydaje się, że nie ma sposobu, aby zmniejszyć ten powtarzający się kod :) Funkcja jest dobra i to było to, co zrobiłem, ale później okazało się, że trudno ją utrzymać, ponieważ Wiele argumentów musiałem zmienić w kilku miejscach, co okazało się jeszcze gorsze niż faktyczne tworzenie dicta przez ręce. –

+0

@duke_nukem tak, to zależy od rzeczywistego użycia. Kod jest w porządku, a format interfejsu jest wystarczająco jasny. Jeśli chcesz osiągnąć coś takiego jak 'format (* args, ** kwargs)', to można to zrobić również, ale nie sądzę, że mogłoby to ułatwić. – okm

1

Można użyć dict() wymagalne:

dict(year=yeah, month=month, location=location) 

Po przejściu argumentów słów kluczowych tworzy dict zawierający elementy, które określone jako kwargs.

Jeśli nie chcesz podać nazwy argumentów, użyj pozycyjnym stylu .format():

>>> a = 'year {0} month {1} location {2}' 
>>> print a.format(2012, 'april', 'abcd') 
year 2012 month april location abcd 

Jeśli jednak spróbować zrobić coś podobnego do tego, co compact() in PHP ma (Tworzenie nazw zmiennych mapowanie dict do jego wartości bez określania nazwy i zmiennej osobno), proszę nie. To po prostu powoduje brzydki nieczytelny kod i i tak wymagałoby paskudnych hacków.

+0

Tak, jestem świadomy dict() ale staram się unikać niepotrzebnego kodu i trochę go zmniejszać. .format może zaakceptować twoją opcję bez dyktowania() przy okazji. Dziękuję Ci. –

+0

Dzięki temu jest blisko tego, czego potrzebuję, jednak przy 10-12 argumentach bardzo trudno jest poruszać się po indeksach. –

+0

Cóż, w tym przypadku powinieneś użyć składni dyktowanej. Jednak w zależności od tego, co chcesz zrobić, rozważ użycie prawdziwego silnika szablonów, takiego jak [jinja2] (http://jinja.pocoo.org/). – ThiefMaster

1

Ty mógł przejść locals():

a.format(**locals()) 

Oczywiście, to ma problemy: trzeba będzie zdać wszystko w mieszkańców, a to może być trudne do zrozumienia wpływu zmiany nazwy lub usuwanie zmiennej .

Lepszym sposobem byłoby:

a.format(**{k:v for k,v in locals() if k in ('year', 'month')}) 
# or; note that if you move the lambda expression elsewhere, you will get a different result 
a.format(**(lambda ld = locals(): {k:ld[k] for k in ('year', 'month')})()) 

Ale to nie jest wcale bardziej zwięzły, chyba że owinąć go z funkcji (które muszą oczywiście brać parametr dict).

3
data = {'year':2012, 'month':'april', 'location': 'q2dm1'} 
a = "year: {year}, month: {month}, location: {location}" 

print a.format(**data) 

..jest tym, czego szukasz. Jest funkcjonalnie identyczny jak w przypadku .format(year=data['year'], ...) lub innych podanych przykładów.

Podwójna asterix jest trudną rzeczą do wyszukania, więc zwykle określa się ją jako "kwargs".Oto good SO question on this syntax

0

Od Python 3.6, można również korzystać z nowej Formatted string literals (f-strings), które można wykorzystać przy zmiennych:

year = 2012 
month = 'april' 
location = 'q2dm1' 
a = f"year: {year}, month: {month}, location: {location}" 
print(a) 

lub słownikowych:

data = {'year': 2012, 'month': 'april', 'location': 'q2dm1'} 
a = f"year: {data['year']}, month: {data['month']}, location: {data['location']}" 
print(a) 

zanotować f przedrostek przed literałem ciągu.

PEP 498: Formatted string literals:

Sformatowanych literały łańcuchowe są prefiksem 'f' i są podobne do formacie ciągi zaakceptowane przez str.format(). Zawierają one zastępujące pola otoczone nawiasami klamrowymi. Pola zamienne są wyrażeń, które są wyceniane w czasie wykonywania, a następnie sformatowane ten protokół() Format:

>>> 
>>> name = "Fred" 
>>> f"He said his name is {name}." 
'He said his name is Fred.' 
>>> width = 10 
>>> precision = 4 
>>> value = decimal.Decimal("12.34567") 
>>> f"result: {value:{width}.{precision}}" # nested fields 
'result:  12.35' 

...

Powiązane problemy