Memahami fungsi repr () dalam Python

152

repr(): representasi string yang dapat dievaluasi dari suatu objek (dapat "eval ()", artinya representasi string yang mengevaluasi ke objek Python)

Dengan kata lain:

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

Pertanyaan:

  1. Mengapa saya mendapatkan penawaran ganda ketika saya melakukannya repr(x)? (Saya tidak mendapatkannya saat melakukannya str(x))
  2. Mengapa saya mendapatkan 'foo'ketika saya melakukannya eval("'foo'")dan bukan x yang merupakan objek?
0101amt
sumber

Jawaban:

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

Jadi namanya xterlampir pada 'foo'string. Ketika Anda menelepon misalnya repr(x), juru bahasa menempatkan 'foo'alih-alih xdan kemudian memanggil repr('foo').

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

reprbenar-benar memanggil metode ajaib __repr__dari x, yang memberikan string yang berisi representasi dari nilai 'foo'ditugaskan untuk x. Jadi itu kembali 'foo'ke dalam string yang ""menghasilkan "'foo'". Idenya repradalah untuk memberikan string yang berisi serangkaian simbol yang dapat kita ketik dalam juru bahasa dan mendapatkan nilai yang sama yang dikirim sebagai argumen repr.

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

Ketika kita menelepon eval("'foo'"), itu sama seperti kita mengetik 'foo'penerjemah. Itu karena kami langsung mengetik konten string luar ""di penerjemah.

>>> 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

Jika kita memanggil eval('foo'), itu sama seperti kita mengetik foopenerjemah. Tetapi tidak ada foovariabel yang tersedia dan pengecualian muncul.

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

strhanya representasi string dari objek (ingat, xvariabel merujuk ke 'foo'), jadi fungsi ini mengembalikan string.

>>> str(5)
'5'

Representasi string dari integer 5adalah '5'.

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

Dan representasi string dari string 'foo'adalah string yang sama 'foo'.

ovgolovin
sumber
Bisakah Anda juga memberi tahu kami beberapa kasus penggunaan saat seseorang harus menggunakan fungsi repr. Saya tidak dapat memahami hal itu
gaurav parashar
14

Umpan balik yang Anda dapatkan dari interpreter interaktif reprjuga digunakan . Saat Anda mengetikkan ekspresi (biarkan saja expr), pada dasarnya juru bahasa melakukannya result = expr; if result is not None: print repr(result). Jadi baris kedua dalam contoh Anda adalah memformat string fooke dalam representasi yang Anda inginkan ( 'foo'). Dan kemudian penerjemah menciptakan represensi dari itu , meninggalkan Anda dengan tanda kutip ganda.

Mengapa ketika saya menggabungkan% r dengan kutip ganda dan kutip tunggal lolos dan mencetaknya, ia mencetaknya seperti saya menulisnya dalam file .py saya tetapi tidak dengan cara yang ingin saya lihat?

Saya tidak yakin apa yang Anda tanyakan di sini. Teks single ' and double " quotes, ketika dijalankan melalui repr, termasuk lolos untuk satu jenis kutipan. Tentu saja, jika tidak, string tersebut tidak akan menjadi string literal yang sah menurut aturan Python. Itulah tepatnya yang Anda minta dengan menelepon repr.

Perhatikan juga bahwa eval(repr(x)) == xanalogi ini tidak dimaksudkan secara literal. Ini adalah perkiraan dan berlaku untuk sebagian besar (semua?) Tipe bawaan, tetapi yang utama adalah Anda mendapatkan ide yang cukup bagus tentang jenis dan "nilai" logis dari melihat reproutput.

Vlad
sumber
2
Awalnya, itu benar-benar itu dimaksudkan untuk menjadi literal: setiap nilai ini reprharus berupa sesuatu yang dapat dikirimkan ke eval(atau disalin dan disisipkan ke dalam kode sumber Anda) untuk menghasilkan nilai yang sama, atau sesuatu yang akan menaikkan SyntaxError ketika Anda mencoba yang (biasanya yang <…>gaya yang dihasilkan oleh object.__repr__). Itu secara bertahap melunakkan selama bertahun-tahun, dan dengan 2,7 dan 3.x itu benar "untuk banyak jenis", dan ada pengecualian bahkan di stdlib (misalnya, namedtuplejenis yang dibuat sebagai lokal akan memberi Anda reprAnda bisa ' t eval), tapi itu ide aslinya.
abarnert
7

str () digunakan untuk membuat output untuk pengguna akhir sementara repr () digunakan untuk pengembangan debuggin. Dan itu mewakili resmi objek.

Contoh:

>>> 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)'

Dari output kita melihat bahwa repr () menunjukkan representasi resmi objek date.

Tanim_113
sumber
3

1) Hasil dari repr('foo')adalah string 'foo' . Di kulit Python Anda, hasil dari ekspresi juga dinyatakan sebagai representasi, jadi Anda pada dasarnya melihat repr(repr('foo')).

2) evalmenghitung hasil ekspresi. Hasilnya selalu berupa nilai (seperti angka, string, atau objek). Beberapa variabel dapat merujuk ke nilai yang sama, seperti pada:

x = 'foo'
y = x

x dan y sekarang merujuk pada nilai yang sama.

3) Saya tidak tahu apa yang Anda maksud di sini. Bisakah Anda memposting contoh, dan apa yang ingin Anda lihat?

phihag
sumber
1

Kapan kamu berkata

foo = 'bar'
baz(foo)

Anda tidak beralih fooke bazfungsi. foohanya nama yang digunakan untuk mewakili nilai, dalam hal ini 'bar', dan nilai tersebut diteruskan ke bazfungsi.

SingleNegationElimination
sumber