Dize biçimlendirilmiş adlandırılmış parametreler?


135

Bunun gerçekten basit bir soru olduğunu biliyorum, ama nasıl google.

nasıl yapabilirim

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

Yani bu my_urliki kez mi kullanılıyor? Ben "isim" %sve sonra params bir dikte kullanmak zorunda varsayıyorum , ama doğru sözdizimi emin değilim?


sadece FYI, paramlarda sadece my_urliki kez kullanabileceğimin farkındayım , ama mesele bu değil :)


Sorunun başlığı biraz yanıltıcı. Bunun print deyimiyle, dize enterpolasyonunun nasıl çalıştığıyla hiçbir ilgisi yoktur.
Greg Ball

Google'ı nasıl kullanacağınız hakkında hiçbir fikriniz yoksa, arama yapmak için buraya gidin: python.org/doc . Önemli bir nedenden dolayı Google'dan daha iyi.
S.Lott

Yanıtlar:


80

Python 2.6+ ve Python 3'te, daha yeni dize biçimlendirme yöntemini kullanmayı seçebilirsiniz.

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

bu da sizi argümanı tekrar etmekten kurtarır veya

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

adlandırılmış parametreler istiyorsanız.

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

Bu kesinlikle konumsaldır ve yalnızca bu format () argümanlarının adsız argümanların önce gelmesi gereken Python kurallarına, ardından adlandırılmış argümanlara, ardından * args (liste veya tuple gibi bir sıraya) ve sonra * kwargs (bir dict sizin için neyin iyi olduğunu biliyorsanız dizelerle anahtarlanır). İnterpolasyon noktaları önce etiketlerindeki adlandırılmış değerlerin yerine ve daha sonra kalanlardan konumlandırılarak belirlenir. Yani, bunu da yapabilirsiniz ...

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

Ama bu değil ...

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

O en güzel # için ++ dan etkisi değişimini görmenin
cod3monk3y

3
Yukarıdaki yöntem, adlandırılmış dize biçimlendirme için değil , bu konumsal dize biçimlendirmedir. Yani bu soruya gerçekten cevap vermiyor.
jaapz

"literal {arg1}".format(arg1="arg!")Terser oysa adlandırılmış biçimi, Python 3.5 ile çalışır f"literal {arg1}"Python 3.6 veya daha yeni, afaik daha yeni bir yeniliktir.
MarkHu

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

3
Ben kwargs ile diksiyon oluşturmayı tercih ediyorum:'<a href="%(url)s">%(url)s</a>' % dict(url=my_url)
schlamar

11
Acaba neden o schmlamarı tercih ediyorsun? Bunun ne anlama geldiğini kolayca
bilemezdim

1
Dokümantasyon bu tanıştığında söylemez, bu nedenle tüm Python 2 sürümlerinde muhtemelen.
Evgeni Sergeev

2
Format () işlevini kullanabiliyorsanız, daha iyi ve daha fazla yerde çalışır. Gerekirse% kullanın.
uchuugaka

39

Python 3.6 ve sonraki sürümlerinde çözüm

Python 3.6 değişmez dize biçimlendirmesi sunar , böylece adlandırılmış parametreleri dizenin dışında herhangi bir tekrarlamadan biçimlendirebilirsiniz:

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

Bu değerlendirilecek my_url, eğer tanımlanmamışsa bir NameError. Aslında, bunun yerine, my_urlbir dizeyi değerlendirdiği sürece ( :sbiçimlendirme kodu nedeniyle ) rastgele bir Python ifadesi yazabilirsiniz . Değiştirmek, bir dize olmayabilir bir ifadenin sonucu için bir dize temsilini istiyorsanız :starafından !sönceden değişmez dize biçimlendirme, sadece normal olduğu gibi,.

Değişmez dize biçimlendirmesi hakkında ayrıntılar için, ilk tanıtıldığı PEP 498'e bakın .


1
Bu PEP tüm formatlayıcıları kapsamıyor gibi görünüyor; Sanırım burada belgelenen str.format ile
aynılar

6

Sözdizimine bağımlı olacaksınız.

Ayrıca C # 6.0, EcmaScript geliştiricileri de bu sözdizimine aşinadır.

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

HTML sayfaları oluşturmak için basit dize enterpolasyonu değil, şablonlama motoru kullanmak istersiniz.


2
Django'nun şablon motoru, yaptığınız e-postalar için ideal bir araç olabilir.
Mike Graham

6
Yöntemiyle bir e-posta gövdesi oluşturmak için bir Django şablonu kullanmanıza engel olan render()nedir? Hiçbir şey, şablon çıktısını beslemeniz gerektiğini söylemez HttpResponse(). Django utanç verici bir şekilde çok yönlü.
Mike DeSimone

1
@Mike: Django'nun da bunun için bir çözümü olabileceğini düşündüm , ancak henüz bulamadım: p Muhtemelen e-postalarımı şablonlara taşıyacağım! Teşekkürler. Belki de gecikiyorum, ama bazı bölgelerde oldukça katı olduğunu gördüm.
Mart'ta

2
@ bu yorumları okuyan insanlar: burada nasıl yapılacağı hakkında daha fazla ayrıntı bulundu rossp.org/blog/2006/jul/11/sending-e-mails-templates
mpen

1
Sorulara yorum yapmak için cevapları değil yorumları kullanmak istersiniz.
suriv

2

Sözlük yolunun yanı sıra, aşağıdaki biçimi bilmek yararlı olabilir:

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

Burada biraz gereksizdir ve sözlük yolu kodu değiştirirken kesinlikle daha az hataya eğilimlidir, ancak yine de birden fazla ekleme için tuples kullanmak mümkündür. Birincisi %s, gruptaki ilk eleman %siçin ikame edilir, ikincisi gruptaki ikinci eleman için ikame edilir, ve gruptaki her eleman için bu şekilde devam eder.


Ben sadece bunu önermek için bir adam kapalı söyledi :) O onun yazısını siliyor. Şimdi kendimi kötü hissediyorum. Evet, bunu yapabileceğimin farkındayım, ama aradığım şey bu değildi. Dediğiniz gibi, bu gereksizdir ve my_urlaslında iki kez değerlendirilmek istemediğim bir işlev çağrısıdır. İki kez o kadar da kötü değil, ama kolayca 20 kez olabilir :)
mpen

5
Başka birine yardım etmesi durumunda benimkini tutacağımı düşündüm. Sözlük yolu büyük olasılıkla gitmek için en iyi yoldur. Ancak fazlalık için, (get_my_url(), )*20işlevi yalnızca bir kez çağırır ve 20 kez çoğaltır.
Mart'ta Ponkadoodle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.