Saya tahu ini pertanyaan yang sangat sederhana, tetapi saya tidak tahu bagaimana cara meng-google-nya.
bagaimana saya bisa melakukannya
print '<a href="%s">%s</a>' % (my_url)
Jadi itu my_url
digunakan dua kali? Saya berasumsi saya harus "memberi nama" %s
dan kemudian menggunakan dict di params, tetapi saya tidak yakin dengan sintaks yang tepat?
FYI saja, saya sadar saya bisa menggunakan my_url
dua kali di params, tapi bukan itu intinya :)
Jawaban:
Di Python 2.6+ dan Python 3, Anda mungkin memilih untuk menggunakan metode pemformatan string yang lebih baru.
print('<a href="{0}">{0}</a>'.format(my_url))
yang menyelamatkan Anda dari pengulangan argumen, atau
print('<a href="{url}">{url}</a>'.format(url=my_url))
jika Anda ingin parameter bernama.
print('<a href="{}">{}</a>'.format(my_url, my_url))
yang benar-benar posisional, dan hanya dilengkapi dengan peringatan bahwa argumen format () mengikuti aturan Python di mana argumen tanpa nama harus didahulukan, diikuti oleh argumen bernama, diikuti oleh * args (urutan seperti list atau tuple) dan kemudian * kwargs (sebuah dict dikunci dengan string jika Anda tahu apa yang baik untuk Anda). Titik interpolasi ditentukan pertama dengan mengganti nilai yang dinamai pada labelnya, dan kemudian posisional dari yang tersisa. Jadi, Anda juga bisa melakukan ini ...
print('<a href="{not_my_url}">{}</a>'.format(my_url, my_url, not_my_url=her_url))
Tapi bukan ini ...
print('<a href="{not_my_url}">{}</a>'.format(my_url, not_my_url=her_url, my_url))
sumber
"literal {arg1}".format(arg1="arg!")
Format bernama bekerja dengan Python 3.5, sedangkan terser yangf"literal {arg1}"
merupakan inovasi baru di Python 3.6 atau yang lebih baru, AFAIK.print('<a href="{url}">{url}</a>'.format(url=my_url))
. Ini bekerja sangat baik dengan Python 2 dan 3.print '<a href="%(url)s">%(url)s</a>' % {'url': my_url}
sumber
'<a href="%(url)s">%(url)s</a>' % dict(url=my_url)
Solusi dengan Python 3.6+
Python 3.6 memperkenalkan pemformatan string literal , sehingga Anda dapat memformat parameter bernama tanpa mengulang salah satu parameter bernama Anda di luar string:
print(f'<a href="{my_url:s}">{my_url:s}</a>')
Ini akan mengevaluasi
my_url
, jadi jika tidak ditentukan, Anda akan mendapatkan fileNameError
. Faktanya, alih-alihmy_url
, Anda dapat menulis ekspresi Python yang berubah-ubah, asalkan dievaluasi ke string (karena:s
kode pemformatannya). Jika Anda menginginkan representasi string untuk hasil ekspresi yang mungkin bukan string, ganti:s
dengan!s
, seperti pemformatan string pra-literal biasa.Untuk detail tentang pemformatan string literal, lihat PEP 498 , di mana ia pertama kali diperkenalkan.
sumber
Anda akan kecanduan sintaks.
Juga C # 6.0, pengembang EcmaScript juga telah memahami sintaks ini.
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
sumber
Untuk membuat halaman HTML, Anda ingin menggunakan mesin template, bukan interpolasi string sederhana.
sumber
render()
metodenya? Tidak ada yang mengatakan Anda harus memasukkan output template keHttpResponse()
. Django adalah memalukan serbaguna.Selain cara kamus, mungkin berguna untuk mengetahui format berikut:
print '<a href="%s">%s</a>' % (my_url, my_url)
Di sini agak berlebihan, dan cara kamus jelas kurang rentan terhadap kesalahan saat memodifikasi kode, tetapi masih mungkin menggunakan tupel untuk beberapa penyisipan. Yang pertama
%s
menggantikan elemen pertama dalam tupel, yang kedua%s
menggantikan elemen kedua dalam tupel, dan seterusnya untuk setiap elemen dalam tupel.sumber
my_url
sebenarnya adalah panggilan fungsi yang saya tidak ingin dievaluasi dua kali. Dua kali tidak terlalu buruk, tapi bisa saja dengan mudah 20 kali :)(get_my_url(), )*20
hanya memanggil fungsi satu kali, dan menggandakannya 20 kali.Pilihan lainnya adalah menggunakan
format_map
:print('<a href="{s}">{s}</a>'.format_map({'s': 'my_url'}))
sumber