ทำความเข้าใจกับฟังก์ชั่น repr () ใน Python


152

repr(): การแทนค่าสตริงที่ประเมินค่าได้ของวัตถุ (สามารถ "eval ()" ได้ซึ่งหมายความว่ามันคือการแทนค่าสตริงที่ประเมินเป็นวัตถุ Python

ในคำอื่น ๆ :

>>> x = 'foo'
>>> repr(x)
"'foo'"

คำถาม:

  1. ทำไมฉันถึงได้รับเครื่องหมายคำพูดคู่เมื่อฉันrepr(x)? (ฉันไม่ได้รับพวกเขาเมื่อฉันstr(x))
  2. ทำไมฉันถึงได้'foo'เมื่อฉันทำeval("'foo'")ไม่ใช่ x ซึ่งเป็นวัตถุ?

คำตอบ:


166
>>> x = 'foo'
>>> x
'foo'

ดังนั้นชื่อที่xแนบมากับ'foo'สตริง เมื่อคุณเรียกเช่นrepr(x)ทำให้ล่าม'foo'แทนแล้วโทรออกxrepr('foo')

>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"

reprจริงเรียกวิธีมายากล__repr__ของxซึ่งจะช่วยให้สตริงที่มีตัวแทนของค่าที่ได้รับมอบหมายให้'foo' xดังนั้นก็จะส่งกลับ'foo'ภายในสตริงที่เกิดขึ้นใน"" "'foo'"ความคิดของคือการให้สตริงที่มีชุดของสัญลักษณ์ที่เราสามารถพิมพ์ในล่ามและได้รับค่าเดียวกันซึ่งถูกส่งเป็นอาร์กิวเมนต์ที่จะเป็นreprrepr

>>> eval("'foo'")
'foo'

เมื่อเราเรียกeval("'foo'")มันเหมือนกับที่เราพิมพ์'foo'ในล่าม มันเป็นเพราะเราพิมพ์เนื้อหาของสายนอก""ในล่ามโดยตรง

>>> eval('foo')

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    eval('foo')
  File "<string>", line 1, in <module>
NameError: name 'foo' is not defined

ถ้าเราเรียกeval('foo')มันเหมือนกับที่เราพิมพ์fooล่าม แต่ไม่มีfooตัวแปรและมีการยกข้อยกเว้น

>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>> 

strเป็นเพียงการแสดงสตริงของวัตถุ (จำไว้ว่าxตัวแปรหมายถึง'foo') ดังนั้นฟังก์ชั่นนี้จะส่งกลับสตริง

>>> str(5)
'5'

ตัวแทนสตริงของจำนวนเต็มคือ5'5'

>>> str('foo')
'foo'

และการเป็นตัวแทนสตริงของสตริงเป็นสายเดียวกัน'foo''foo'


คุณสามารถแจ้งให้เราทราบกรณีใช้งานบางกรณีเมื่อควรใช้ฟังก์ชั่น repr ฉันไม่สามารถเข้าใจว่า
gaurav parashar

14

ความคิดเห็นที่คุณได้รับจากล่ามแบบโต้ตอบreprก็ใช้เช่นกัน เมื่อคุณพิมพ์นิพจน์ (ให้เป็นexpr) ล่ามก็จะทำresult = expr; if result is not None: print repr(result)เช่นนั้น ดังนั้นบรรทัดที่สองในตัวอย่างของคุณคือการจัดรูปแบบสตริงfooเป็นตัวแทนที่คุณต้องการ ( 'foo') และจากนั้นล่ามสร้างrepresentation ของที่ออกจากคุณกับคำพูดคู่

ทำไมเมื่อฉันรวม% r เข้ากับเครื่องหมายคำพูดคู่และคำพูดเดี่ยวและพิมพ์ออกมามันพิมพ์ในแบบที่ฉันจะเขียนในไฟล์. py ของฉัน แต่ไม่ใช่วิธีที่ฉันต้องการดู

ฉันไม่แน่ใจว่าคุณถามอะไรที่นี่ ข้อความsingle ' and double " quotesเมื่อทำงานผ่านจะreprรวมการหลีกเลี่ยงสำหรับคำพูดหนึ่งประเภท แน่นอนมันไม่เช่นนั้นมันจะไม่ใช่ตัวอักษรสตริงที่ถูกต้องตามกฎของ Python reprนั่นคือสิ่งที่คุณถามหาโดยการเรียก

โปรดทราบว่าการeval(repr(x)) == xเปรียบเทียบไม่ได้หมายถึงตัวอักษรที่แท้จริง มันเป็นการประมาณและถือเป็นจริงสำหรับชนิดในตัวส่วนใหญ่ (ทั้งหมด?) แต่สิ่งสำคัญคือคุณจะได้แนวคิดที่ดีเกี่ยวกับประเภทและตรรกะ "ค่า" จากการดูreprผลลัพธ์


2
แต่เดิมก็จริงถูกหมายถึงการเป็นตัวอักษร: ทุกมูลค่าreprทั้งควรเป็นสิ่งที่สามารถส่งผ่านไปeval(หรือคัดลอกและวางลงในซอร์สโค้ดของคุณ) ในการผลิตมีค่าเท่ากันหรือบางสิ่งบางอย่างที่จะยกระดับ SyntaxError เมื่อคุณพยายามที่ (มักจะ<…>สไตล์ที่ผลิตโดยobject.__repr__) นั่นคือค่อยๆกระชับลงในช่วงหลายปีที่ผ่านมาและโดย 2.7 และ 3.x มันเป็นความจริง "สำหรับหลายประเภท" และมีข้อยกเว้นแม้ใน stdlib (เช่นnamedtupleประเภทที่สร้างขึ้นเป็นท้องถิ่นจะช่วยให้reprคุณสามารถ ' t eval) แต่มันเป็นความคิดดั้งเดิม
abarnert

7

str () ใช้สำหรับสร้างผลลัพธ์สำหรับผู้ใช้ในขณะที่ repr () ใช้สำหรับการพัฒนา debuggin และเป็นตัวแทนอย่างเป็นทางการของวัตถุ

ตัวอย่าง:

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2018-04-08 18:00:15.178404'
>>> repr(today)
'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'

จากผลลัพธ์ที่เราเห็นว่า repr () แสดงการเป็นตัวแทนอย่างเป็นทางการของวัตถุวันที่


3

1) ผลจากการrepr('foo')เป็นสตริง ในหลามเปลือกของผลของการแสดงออกที่จะแสดงเป็นตัวแทนเกินไปดังนั้นคุณจะเห็นเป็นหลัก'foo'repr(repr('foo'))

2) evalคำนวณผลลัพธ์ของนิพจน์ ผลลัพธ์จะเป็นค่าเสมอ(เช่นตัวเลขสตริงหรือวัตถุ) ตัวแปรหลายตัวสามารถอ้างถึงค่าเดียวกันเช่นเดียวกับใน:

x = 'foo'
y = x

x และ y ตอนนี้อ้างถึงค่าเดียวกัน

3) ฉันไม่รู้ว่าคุณหมายถึงอะไรที่นี่ คุณสามารถโพสต์ตัวอย่างและสิ่งที่คุณต้องการดู


1

เมื่อคุณพูด

foo = 'bar'
baz(foo)

คุณไม่ได้ผ่านfooไปยังbazฟังก์ชั่น fooเป็นเพียงชื่อที่ใช้แทนค่าในกรณีนี้'bar'และค่านั้นถูกส่งผ่านไปยังbazฟังก์ชัน

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