2013-07-27 12 views
44

Przypadek 1:formatu ciągi i nazwane argumenty w Pythonie

"{arg1} {arg2}".format (10, 20) 

To da KeyError: 'arg1' bo nie przechodzą nazwanych argumentów.

Przypadek 2:

"{arg1} {arg2}".format(arg1 = 10, arg2 = 20) 

Teraz to będzie działać poprawnie ponieważ zdałem nazwanych argumentów. I drukuje '10 20'

Przypadek 3:

, a jeśli mijam złą nazwę pokaże KeyError: 'arg1'

"{arg1} {arg2}".format(wrong = 10, arg2 = 20) 

ale

Przypadek 4:

Jeśli przekażę nazwane argumenty niewłaściwej kolejności

"{arg1} {arg2}".format(arg2 = 10, arg1 = 20) 

Działa ...

i drukuje '20 10'

Moje pytanie brzmi, dlaczego to działa i co jest wykorzystanie nazwanych argumentów w ten walizka.

+0

Myślę, że są po prostu dla czytelności. – svineet

+3

Ponieważ szuka go po imieniu, a nie pozycji ... jak sądzisz, co oznaczają te argumenty? – aaa90210

+1

Wygląda na to, że po prostu zmieniono nazwę na arg2 na arg1 i na odwrót. innymi słowy, arg1 ma teraz wartość 20 zamiast 10, dlatego pierwsza liczba w tekście ciągu jest równa 20 zamiast 10. Aby wykonać test, który chciałeś, wystarczy przesunąć argumenty ORAZ ich wartości do nowej pozycji w wywołanie format() i będzie zachowywać się tak, jak oczekujesz. Nic tu nie jest niezwykłe. –

Odpowiedz

76

nazwanych pól zamienne (the {...} części w format string) meczu z argumentów kluczowych do metody .format(), a nie pozycyjnych argumentów.

Argumenty słów kluczowych są jak klucze w słowniku; zamówienie nie ma znaczenia, ponieważ są one dopasowane do nazwy o nazwie.

Jeśli chciał dopasować przeciwko pozycyjnych argumentów używać liczb:

"{0} {1}".format(10, 20) 

W Pythonie 2.7 i wyżej, można pominąć liczby; pola zamienne {} są następnie automatycznie numerowane w kolejności pojawiania się w ciągu formatowania:

"{} {}".format(10, 20) 

Łańcuch formatowania może mecz z obu pozycyjnych i argumentów kluczowych, można użyć argumentów wielokrotnie:

"{1} {ham} {0} {foo} {1}".format(10, 20, foo='bar', ham='spam') 

Cytowanie z format string specification:

field_name samo w sobie zaczyna się od nazwa_argumentu, która jest albo numer lub słowo kluczowe. Jeśli jest to liczba, odnosi się do argumentu pozycyjnego, a jeśli jest to słowo kluczowe, odnosi się do argumentu o nazwie słowa kluczowego.

Podkreślam moją.

Jeśli tworzysz duży ciąg formatowania, często jest on o wiele bardziej czytelny i łatwiejszy w użyciu, aby używać nazwanych pól zastępczych, więc nie musisz odliczać argumentów i dowiedzieć się, jaki argument trafia w wynikowy ciąg znaków .

Można również użyć **keywords nazywając składni zastosować istniejący słownika do formatu, dzięki czemu można łatwo włączyć plik CSV w sformatowanym wyjściu:

import csv 

fields = ('category', 'code', 'price', 'description', 'link', 'picture', 'plans') 
table_row = '''\ 
    <tr> 
     <td><img src="{picture}"></td> 
     <td><a href="{link}">{description}</a> ({price:.2f})</td> 
    </tr> 
''' 

with open(filename, 'rb') as infile: 
    reader = csv.DictReader(infile, fieldnames=fields, delimiter='\t') 
    for row in reader: 
     row['price'] = float(row['price']) # needed to make `.2f` formatting work 
     print table_row.format(**row) 

Tutaj picture, link, description i price są wszystkie klucze w słowniku row i o wiele łatwiejsze jest , aby zobaczyć, co stanie się, gdy zastosuję row do ciągu formatowania.

+0

Nie jest to po prostu bardziej czytelne, jest również bardzo przydatne w przypadku pracy z językami naturalnymi i "internacjonalizacją" (i18n), gdzie czasem chcesz, aby poszczególne części sformatowanej wiadomości pojawiały się w różnych zamówieniach w różnych językach. – torek

+0

@torek: Nie miałem zamiaru wchodzić w różne uporządkowania w szablonie; chodzi o to, że każda szczelina odnosi się do konkretnego argumentu. Możesz umieścić argumenty pozycyjne w innej kolejności również w szablonie. –