Jestem wielkim fanem używania słowników do formatowania ciągów. Pomaga mi odczytać używany format ciągów, a także pozwala mi korzystać z istniejących słowników. Na przykład:
class MyClass:
def __init__(self):
self.title = 'Title'
a = MyClass()
print 'The title is %(title)s' % a.__dict__
path = '/path/to/a/file'
print 'You put your file here: %(path)s' % locals()
Nie mogę jednak rozgryźć składni Pythona 3.x, aby zrobić to samo (a jeśli to w ogóle możliwe). Chciałbym wykonać następujące czynności
# Fails, KeyError 'latitude'
geopoint = {'latitude':41.123,'longitude':71.091}
print '{latitude} {longitude}'.format(geopoint)
# Succeeds
print '{latitude} {longitude}'.format(latitude=41.123,longitude=71.091)
python
string
dictionary
python-3.x
Doran
źródło
źródło
Czy to dla ciebie dobre?
źródło
format_map
. Podobnystr.format(**mapping)
, z wyjątkiem tego, żemapping
jest używany bezpośrednio i nie jest kopiowany do plikudict
. Jest to przydatne, jeśli na przykładmapping
jest podklasa dictprint(**geopoint)
Jest taki sam jakprint(longitude=71.091, latitude=41.123)
. W wielu językach jest znany jako operator ikony . W JavaScript nazywa się to operatorem rozprzestrzeniania . W Pythonie nie ma konkretnej nazwy dla tego operatora.Aby rozpakować słownik na argumenty słów kluczowych, użyj
**
. Również formatowanie w nowym stylu obsługuje odwoływanie się do atrybutów obiektów i elementów odwzorowań:źródło
'{0[latitude]} {1[latitude]} {0[longitude]} {1[longitude]}'.format(geopoint0, geopoint1)
defaultdict
i nie masz wszystkich kluczyPonieważ Python 3.0 i 3.1 są EOL'ed i nikt ich nie używa, możesz i powinieneś używać
str.format_map(mapping)
(Python 3.2+):Oznacza to, że możesz użyć na przykład a
defaultdict
, który ustawi (i zwróci) domyślną wartość dla brakujących kluczy:Nawet jeśli dostarczone mapowanie to
dict
podklasą, a nie podklasą, prawdopodobnie nadal byłoby to nieco szybsze.Biorąc pod uwagę, różnica nie jest duża
następnie
jest około 10 ns (2%) szybszy niż
w moim Pythonie 3.4.3. Różnica byłaby prawdopodobnie większa, ponieważ więcej kluczy znajduje się w słowniku i
Pamiętaj jednak, że język formatu jest znacznie bardziej elastyczny; mogą zawierać wyrażeń indeksowane dostępy atrybutów i tak dalej, więc można sformatować cały obiekt lub 2 z nich:
Począwszy od wersji 3.6, można również używać interpolowanych ciągów:
Trzeba tylko pamiętać, aby użyć innych znaków cudzysłowu w zagnieżdżonych cudzysłowach. Inną zaletą tego podejścia jest to, że jest znacznie szybsze niż wywoływanie metody formatowania.
źródło
format
? (Biorąc pod uwagę, że nie jest on kopiowany do'%(latitude)s %(longitude)s'%geopoint
;)źródło
Składnia Python 2 działa również w Python 3:
źródło
f""
lub"".format()
;)źródło
print('%(latitude)s %(longitude)s'%geopoint)
jest to również znacznie szybsze niż inne 2'%(geopoint["latitude"])s %(geopoint["longitude"])s'%{"geopoint":geopoint}
Większość odpowiedzi sformatowała tylko wartości nagrania.
Jeśli chcesz również sformatować klucz w ciągu, możesz użyć dict.items () :
Wynik:
Jeśli chcesz sformatować w sposób arbitralny, to znaczy, nie pokazując kluczowych wartości, takich jak krotki:
Wynik:
źródło
geopoint.items()
;)