การจัดรูปแบบสตริงพารามิเตอร์ชื่อ?


135

ฉันรู้ว่ามันเป็นคำถามง่ายๆ แต่ฉันไม่รู้ว่าจะใช้ Google ได้อย่างไร

ฉันจะทำอย่างไร

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

จึงmy_urlใช้สองครั้ง? ฉันคิดว่าฉันต้อง "ตั้งชื่อ" %sแล้วใช้ dict ใน params แต่ฉันไม่แน่ใจเกี่ยวกับไวยากรณ์ที่ถูกต้อง?


แค่ FYI ฉันรู้ว่าฉันสามารถใช้my_urlสองครั้งใน params ได้ แต่นั่นไม่ใช่ประเด็น :)


ชื่อคำถามค่อนข้างทำให้เข้าใจผิด สิ่งนี้ไม่เกี่ยวข้องกับคำสั่งพิมพ์เพียงแค่การแก้ไขสตริงทำงานอย่างไร
Greg Ball

เมื่อคุณมีความคิดวิธีการ google มันไม่ไปที่นี่จะใช้การค้นหา: python.org/doc ดีกว่า Google ด้วยเหตุผลสำคัญประการหนึ่ง
ล็อต

คำตอบ:


81

ใน Python 2.6+ และ Python 3 คุณอาจเลือกใช้วิธีการจัดรูปแบบสตริงที่ใหม่กว่า

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

ซึ่งช่วยให้คุณไม่ต้องโต้แย้งซ้ำหรือ

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

หากคุณต้องการพารามิเตอร์ที่ตั้งชื่อ

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

ซึ่งเป็นตำแหน่งอย่างเคร่งครัดและมาพร้อมกับข้อแม้ที่อาร์กิวเมนต์ format () จะเป็นไปตามกฎของ Python โดยที่ args ที่ไม่มีชื่อต้องมาก่อนตามด้วยอาร์กิวเมนต์ที่มีชื่อตามด้วย * args (ลำดับเช่น list หรือ tuple) แล้ว * kwargs (a dict คีย์ด้วยสตริงถ้าคุณรู้ว่าอะไรดีสำหรับคุณ) จุดแก้ไขจะถูกกำหนดก่อนโดยการแทนที่ค่าที่ตั้งชื่อที่เลเบลจากนั้นจึงกำหนดตำแหน่งจากสิ่งที่เหลือ ดังนั้นคุณสามารถทำได้ ...

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

แต่ไม่ใช่นี่ ...

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


3
วิธีการข้างต้นไม่ได้ใช้สำหรับการจัดรูปแบบสตริงที่มีชื่อแต่นี่คือการจัดรูปแบบสตริงตำแหน่ง ดังนั้นนี่จึงไม่ตอบคำถามจริงๆ
jaapz

"literal {arg1}".format(arg1="arg!")รูปแบบชื่อทำงานกับงูหลาม 3.5 ในขณะที่ terser f"literal {arg1}"เป็นนวัตกรรมใหม่ในหลาม 3.6 หรือใหม่กว่า, AFAIK
MarkHu

ความคิดเห็นจาก @jaapz print('<a href="{url}">{url}</a>'.format(url=my_url))ไม่ถูกต้องพิจารณาการเปลี่ยนแปลงเพื่อให้คำตอบนี้ที่มีไวยากรณ์ที่ไม่ใช่ตำแหน่ง ใช้งานได้ดีทั้งกับ Python 2 และ 3
Danila Vershinin

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

3
ฉันชอบสร้าง dict ด้วย kwargs:'<a href="%(url)s">%(url)s</a>' % dict(url=my_url)
schlamar

11
ฉันสงสัยว่าทำไมคุณถึงชอบ Schmlamar มากกว่า? ฉันคงไม่รู้ว่ามันหมายถึงอะไรเมื่อเทียบกับคำประกาศปกติของคำสั่งที่ OP ใช้ ...
GreenAsJade

1
เอกสารไม่ได้บอกว่าเมื่อได้รับการแนะนำดังนั้นมันอาจจะในทุกหลาม 2 รุ่น
Evgeni Sergeev

2
ใช้รูปแบบ () ถ้าทำได้มันจะทำงานได้ดีขึ้นและในหลาย ๆ ที่มากขึ้น ใช้% ถ้าคุณต้อง
uchuugaka

39

โซลูชันใน Python 3.6+

Python 3.6 แนะนำการจัดรูปแบบสตริงตามตัวอักษรเพื่อให้คุณสามารถจัดรูปแบบพารามิเตอร์ที่ตั้งชื่อโดยไม่ต้องทำซ้ำพารามิเตอร์ที่ตั้งชื่อของคุณนอกสตริง:

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

สิ่งนี้จะประเมินmy_urlดังนั้นหากไม่ได้กำหนดไว้คุณจะได้รับไฟล์NameError. ในความเป็นจริงmy_urlคุณสามารถเขียนนิพจน์ Python ตามอำเภอใจแทนได้ตราบใดที่มันประเมินเป็นสตริง (เนื่องจาก:sรหัสการจัดรูปแบบ) หากคุณต้องการการแทนค่าสตริงสำหรับผลลัพธ์ของนิพจน์ที่อาจไม่ใช่สตริงให้แทนที่:sด้วย!sเช่นเดียวกับการจัดรูปแบบสตริงแบบอักษรก่อนตัวอักษรปกติ

สำหรับรายละเอียดเกี่ยวกับการจัดรูปแบบสตริงตามตัวอักษรโปรดดูที่PEP 498ซึ่งเป็นที่ที่เปิดตัวครั้งแรก


1
ดูเหมือนว่า PEP จะไม่ครอบคลุมรูปแบบทั้งหมด ฉันคิดว่ามันเหมือนกับ str.format ซึ่งมีการบันทึกไว้ที่นี่: docs.python.org/3.4/library/string.html#formatstrings
mpen

6

คุณจะติดไวยากรณ์

นอกจากนี้ C # 6.0 นักพัฒนา EcmaScript ยังช่วยเพิ่มไวยากรณ์นี้

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 คุณต้องการใช้โปรแกรมสร้างเทมเพลตไม่ใช่การแก้ไขสตริงแบบง่ายๆ


2
เครื่องมือสร้างเทมเพลตของ Django อาจพิสูจน์ได้ว่าเป็นเครื่องมือที่เหมาะสำหรับอีเมลที่คุณกำลังทำ
Mike Graham

6
อะไรที่ทำให้คุณหยุดใช้เทมเพลต Django เพื่อสร้างเนื้อหาอีเมลด้วยrender()วิธีการ HttpResponse()กล่าวว่าไม่มีอะไรที่คุณต้องกินอาหารส่งออกแม่แบบ Django มีความหลากหลายอย่างน่าอาย
Mike DeSimone

1
@ ไมค์: ฉันคิดว่า Django อาจมีวิธีแก้ปัญหานี้ด้วย แต่ฉันยังไม่พบ: p ฉันอาจจะย้ายอีเมลของฉันไปเป็นเทมเพลตแล้ว! ขอบคุณ. บางทีฉันอาจจะขี้เกียจ แต่ฉันพบว่ามันค่อนข้างเข้มงวดในบางพื้นที่
mpen

2
@random คนที่อ่านความคิดเห็นเหล่านี้: พบรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำที่นี่rossp.org/blog/2006/jul/11/sending-e-mails-templates
mpen

1
สำหรับการแสดงความคิดเห็นเกี่ยวกับคำถามคุณต้องการใช้ความคิดเห็นไม่ใช่คำตอบ
suriv

2

เช่นเดียวกับวิธีการใช้พจนานุกรมการทราบรูปแบบต่อไปนี้อาจเป็นประโยชน์:

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

ที่นี่มีความซ้ำซ้อนเล็กน้อยและวิธีการในพจนานุกรมมีโอกาสเกิดข้อผิดพลาดน้อยกว่าเมื่อแก้ไขโค้ด แต่ก็ยังสามารถใช้ tuples สำหรับการแทรกหลาย ๆ องค์ประกอบแรก%sถูกแทนที่สำหรับองค์ประกอบแรกในทูเปิลส่วนที่สอง%sถูกแทนที่ด้วยองค์ประกอบที่สองในทูเปิลและอื่น ๆ สำหรับแต่ละองค์ประกอบในทูเปิล


ฉันเพิ่งบอกผู้ชายคนหนึ่งเพื่อแนะนำสิ่งนี้ :) เขาลบโพสต์ของเขา ตอนนี้ฉันรู้สึกแย่มาก ใช่ฉันรู้ว่าฉันทำได้ แต่มันไม่ใช่สิ่งที่ฉันกำลังมองหา อย่างที่คุณพูดมันซ้ำซ้อนและmy_urlจริงๆแล้วเป็นการเรียกใช้ฟังก์ชันที่ฉันไม่ต้องการให้มีการประเมินซ้ำสองครั้ง Twice ไม่ได้แย่มาก แต่มันอาจจะเป็น 20 ครั้งได้ง่ายๆ :)
mpen

5
ฉันคิดว่าจะเก็บของฉันไว้เผื่อว่าจะได้ช่วยคนอื่น ทางพจนานุกรมน่าจะเป็นวิธีที่ดีที่สุด แต่สำหรับความซ้ำซ้อนให้(get_my_url(), )*20เรียกใช้ฟังก์ชันเพียงครั้งเดียวและทำซ้ำ 20 ครั้ง
Ponkadoodle

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.