it-swarm-id.com

Memahami fungsi repr () di Python

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

Dengan kata lain:

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

Pertanyaan:

  1. Mengapa saya mendapatkan tanda kutip ganda saat melakukan repr(x)? (Saya tidak mendapatkannya saat melakukan str(x))
  2. Mengapa saya mendapatkan 'foo' ketika saya melakukan eval("'foo'") dan bukan x yang mana objeknya?
136
0101amt
>>> x = 'foo'
>>> x
'foo'

Jadi nama x dilampirkan ke string 'foo'. Ketika Anda memanggil misalnya repr(x) interpreter meletakkan 'foo' alih-alih x dan kemudian memanggil repr('foo').

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

repr sebenarnya memanggil metode ajaib __repr__ dari x, yang memberikan string yang berisi representasi dari nilai 'foo' ditugaskan ke x. Jadi ia mengembalikan 'foo' di dalam string "" menghasilkan "'foo'". Gagasan repr adalah untuk memberikan string yang berisi serangkaian simbol yang dapat kita ketik di interpreter dan mendapatkan nilai yang sama yang dikirim sebagai argumen ke repr.

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

Ketika kita memanggil eval("'foo'"), itu sama dengan kita mengetik 'foo' dalam interpreter. Itu karena kita 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 dengan kita mengetik foo dalam interpreter. Tetapi tidak ada variabel foo yang tersedia dan pengecualian dimunculkan.

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

str hanyalah representasi string dari objek (ingat, variabel x mengacu pada 'foo'), jadi fungsi ini mengembalikan string.

>>> str(5)
'5'

Representasi string dari integer 5 adalah '5'.

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

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

158
ovgolovin

Umpan balik yang Anda dapatkan dari interpreter interaktif menggunakan repr juga. Saat Anda mengetikkan ekspresi (biarkan expr), penerjemah pada dasarnya melakukan result = expr; if result is not None: print repr(result). Jadi baris kedua dalam contoh Anda is memformat string foo ke dalam representasi yang Anda inginkan ('foo'). Dan kemudian interpreter menciptakan representation dari that, 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 berdasarkan aturan Python. Itulah tepatnya yang Anda minta dengan menelepon repr.

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

9
user395760

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

2) eval menghitung hasil ekspresi. Hasilnya selalu 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?

3
phihag

Kapan kamu berkata

foo = 'bar'
baz(foo)

anda tidak meneruskan foo ke fungsi baz. foo hanya nama yang digunakan untuk mewakili nilai, dalam hal ini 'bar', dan nilai tersebut diteruskan ke fungsi baz.

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.

2
Tanim_113