Formatowanie nazwanych parametrów ciągu znaków?


134

Wiem, że to naprawdę proste pytanie, ale nie mam pojęcia, jak to znaleźć w Google.

jak mogę to zrobić

print '<a href="%s">%s</a>' % (my_url)

Więc to my_urljest używane dwukrotnie? Zakładam, że muszę „nazwać”, %sa następnie użyć dyktowania w parametrach, ale nie jestem pewien prawidłowej składni?


tylko do Twojej wiadomości, wiem, że mogę użyć my_urldwa razy w parametrach, ale nie o to chodzi :)


Tytuł pytania jest nieco mylący. Nie ma to nic wspólnego z instrukcją print, tylko z tym, jak działa interpolacja ciągów.
Greg Ball

Jeśli nie masz pojęcia, jak to wygooglować , przejdź tutaj, aby użyć wyszukiwania: python.org/doc . Jest lepszy niż Google z jednego ważnego powodu.
S.Lott,

@ S.Lott To bardzo pomocne / s
mpen

Odpowiedzi:


79

W Pythonie 2.6+ i Pythonie 3 możesz wybrać nowszą metodę formatowania ciągów.

print('<a href="{0}">{0}</a>'.format(my_url))

co oszczędza ci powtarzania argumentu, lub

print('<a href="{url}">{url}</a>'.format(url=my_url))

jeśli chcesz nazwane parametry.

print('<a href="{}">{}</a>'.format(my_url, my_url))

który jest ściśle pozycyjny i zawiera tylko zastrzeżenie, że argumenty format () są zgodne z regułami Pythona, gdzie nienazwane argumenty muszą znajdować się na pierwszym miejscu, po których następują nazwane argumenty, po których następuje * args (sekwencja taka jak lista lub krotka), a następnie * kwargs (dykt z kluczem, jeśli wiesz, co jest dla Ciebie dobre). Punkty interpolacji są określane najpierw przez podstawienie nazwanych wartości na ich etykietach, a następnie pozycyjne z tego, co zostało. Więc możesz też to zrobić ...

print('<a href="{not_my_url}">{}</a>'.format(my_url, my_url, not_my_url=her_url))

Ale nie to ...

print('<a href="{not_my_url}">{}</a>'.format(my_url, not_my_url=her_url, my_url))

Miło jest zobaczyć zmianę wpływu z ++ na #
cod3monk3y

3
Powyższa metoda nie służy jednak do formatowania nazwanych ciągów, jest to jednak formatowanie ciągów pozycyjnych. Więc to tak naprawdę nie odpowiada na pytanie.
jaapz

"literal {arg1}".format(arg1="arg!")Nazwie Format współpracuje z Pythona 3.5, natomiast terser f"literal {arg1}"to nowsze innowacje w Pythonie 3.6 lub nowsza AFAIK.
MarkHu

218
print '<a href="%(url)s">%(url)s</a>' % {'url': my_url}

3
Wolę tworzyć dyktando z kwargs:'<a href="%(url)s">%(url)s</a>' % dict(url=my_url)
schlamar

11
Zastanawiam się, dlaczego wolisz ten schmlamar? Nie wiedziałbym od
razu,

1
Dokumentacja nie mówi, kiedy to został wprowadzony, więc to chyba we wszystkich Python 2 wersjach.
Evgeni Sergeev

2
Jeśli możesz, użyj format (), działa lepiej i w większej liczbie miejsc. Użyj%, jeśli MUSISZ.
uchuugaka,

39

Rozwiązanie w Pythonie 3.6+

Python 3.6 wprowadza dosłowne formatowanie ciągów , dzięki czemu można formatować nazwane parametry bez powtarzania któregokolwiek z nazwanych parametrów poza ciągiem:

print(f'<a href="{my_url:s}">{my_url:s}</a>')

To oceni my_url, więc jeśli nie jest zdefiniowane, otrzymasz plik NameError. W rzeczywistości zamiast tego my_urlmożesz napisać dowolne wyrażenie Pythona, o ile wylicza się na łańcuch (ze względu na :skod formatujący). Jeśli chcesz, aby wynik wyrażenia, który może nie być ciągiem, miał reprezentację w postaci ciągu, zamień :sna !s, tak jak w przypadku zwykłego formatowania ciągu znaków.

Aby uzyskać szczegółowe informacje na temat dosłownego formatowania ciągów, zobacz PEP 498 , gdzie zostało to wprowadzone po raz pierwszy.


1
Wydaje się, że PEP nie obejmuje wszystkich elementów formatujących; Myślę, że są takie same jak str.format, który jest udokumentowany tutaj: docs.python.org/3.4/library/string.html#formatstrings
mpen

6

Będziesz uzależniony od składni.

Również programiści C # 6.0 i EcmaScript również znają tę składnię.

In [1]: print '{firstname} {lastname}'.format(firstname='Mehmet', lastname='Ağa')
Mehmet Ağa

In [2]: print '{firstname} {lastname}'.format(**dict(firstname='Mehmet', lastname='Ağa'))
Mehmet Ağa

5

Do budowania stron HTML chcesz użyć mechanizmu tworzenia szablonów, a nie prostej interpolacji ciągów.


2
Silnik szablonów Django może również okazać się idealnym narzędziem do tworzenia e-maili.
Mike Graham

6
Co powstrzymuje Cię przed użyciem szablonu Django do wygenerowania treści wiadomości e-mail za pomocą jego render()metody? Nic nie mówi, że musisz przesyłać dane wyjściowe szablonu HttpResponse(). Django jest zawstydzająco wszechstronny.
Mike DeSimone

1
@Mike: Myślałem, że Django też może mieć na to rozwiązanie, ale jeszcze go nie znalazłem: p Prawdopodobnie przeniosę wtedy moje e-maile do szablonów! Dzięki. Może jestem spóźniony, ale stwierdziłem, że w niektórych obszarach jest dość sztywny.
mpen

2
@ Losowe osoby, które czytają te komentarze: więcej szczegółów na temat tego, jak to zrobić, można znaleźć
mpen

1
Do komentowania pytań chcesz używać komentarzy, a nie odpowiedzi.
suriv

2

Oprócz sposobu słownikowego przydatna może być znajomość następującego formatu:

print '<a href="%s">%s</a>' % (my_url, my_url)

Tutaj jest to odrobinę nadmiarowe, a sposób słownikowy jest z pewnością mniej podatny na błędy podczas modyfikowania kodu, ale nadal można używać krotek do wielu wstawień. Pierwszy %sjest podstawiony przez pierwszy element w krotce, drugi %sjest podstawiony przez drugi element w krotce i tak dalej dla każdego elementu w krotce.


Właśnie odrzuciłem gościa za sugestię :) Usunął swój post. Czuję się teraz trochę źle. Tak, zdaję sobie sprawę, że mogę to zrobić, ale to nie było to, czego szukałem. Jak powiedziałeś, jest to zbędne i my_urljest w rzeczywistości wywołaniem funkcji, którego nie chcę, aby było oceniane dwukrotnie. Dwa razy nie jest tak źle, ale spokojnie mogłoby to być 20 razy :)
mpen

5
Pomyślałem, że zatrzymam swoją, na wypadek gdyby komuś to pomogło. Cóż, prawdopodobnie najlepszym sposobem jest użycie słownika. Ale ze względu na nadmiarowość (get_my_url(), )*20wywołuje funkcję tylko raz i powiela ją 20 razy.
Ponkadoodle
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.