Python'da repr () işlevini anlama


152

repr(): bir nesnenin değerlendirilebilir dize temsili ("eval ()" olabilir, yani bir Python nesnesini değerlendiren bir dize temsilidir)

Diğer bir deyişle:

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

Sorular:

  1. Yaptığımda neden çift tırnak alıyorum repr(x)? (Yaptığımda onları anlamıyorum str(x))
  2. Neden alırım 'foo'ben ne zaman eval("'foo'")ve x nesne hangisi?

Yanıtlar:


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

Böylece ad dizeye xeklenir 'foo'. Örneğin aradığınızda repr(x)yorumlayıcı 'foo'yerine koyar xve sonra çağırır repr('foo').

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

repraslında sihirli yöntemini çağırır __repr__ait xverir dizesini değerinin gösterimi içeren 'foo'atanan x. Böylece sonuçta ortaya çıkan 'foo'dizenin içine geri döner . Buradaki fikir , yorumlayıcıya yazabileceğimiz ve bağımsız değişken olarak gönderilen aynı değeri elde edebileceğimiz bir dizi sembol içeren bir dize vermektir ."""'foo'"reprrepr

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

Aradığımızda , tercümanda yazdığımızla eval("'foo'")aynıdır 'foo'. Dış dizenin içeriğini doğrudan ""yorumlayıcıya yazdığımız gibidir.

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

Eğer ararsak eval('foo'), footercümanda yazdığımızla aynıdır . Ancak fookullanılabilir bir değişken yoktur ve bir istisna ortaya çıkar.

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

stryalnızca nesnenin dize temsilidir (unutmayın, xdeğişken başvurur 'foo'), bu nedenle bu işlev dize döndürür.

>>> str(5)
'5'

Tamsayı String gösterimi 5olup '5'.

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

Ve dizenin dize gösterimi 'foo'aynı dizedir 'foo'.


Ayrıca repr işlevini kullanmanız gereken bazı kullanım durumlarını bize bildirir misiniz? Bunu kavrayamıyorum
gaurav parashar

14

Etkileşimli tercümanla ilgili geri bildirimler reprde kullanır . Bir ifade yazdığınızda (olmasına izin verin expr), temel olarak yorumlayıcı yapar result = expr; if result is not None: print repr(result). Sizin örnekte ikinci satır Yani edilir dize biçimlendirme footemsil içine istediğiniz ( 'foo'). Ve sonra tercüman oluşturur reprait esentation o çift tırnak size bırakarak.

Neden% r'yi çift tırnak işareti ve tek tırnak işareti ile birleştirdiğimde ve yazdırdığımda, .py dosyama yazdığım şekilde yazdırıyor, ancak görmek istediğim şekilde değil?

Burada ne istediğinden emin değilim. Metin single ' and double " quotes, üzerinden geçtiğinde repr, bir tür alıntı için kaçışlar içerir. Elbette öyle, aksi takdirde Python kuralları tarafından geçerli bir dize değişmezi olmazdı. Arayarak tam olarak bunu istediniz repr.

Ayrıca eval(repr(x)) == xbenzetmenin gerçek anlamına gelmediğine dikkat edin . Bu bir yaklaşımdır ve çoğu (tümü?) Yerleşik türler için doğrudur, ancak asıl şey, reprçıktıya bakmaktan tür ve mantıksal "değer" hakkında oldukça iyi bir fikir edinmenizdir .


2
Başlangıçta, aslında edildi edebi olması gerekiyordu: Her değer en reprbirine geçirilebilir bir şey olmalıdır evalgenellikle (yani çalıştığınızda SyntaxError yükseltecektir (kaynak koduna veya kopyalanıp yapıştırılan) eşit bir değer üretmek için, ya da bir şey <…>tarafından üretilen tarzı object.__repr__). Kademeli olarak yılda aşağı tonda ve 2.7 ve 3.x tarafından o "Birçok türleri için" sadece doğru ve istisnalar (örneğin ,, bir hatta stdlib içinde var olduğu namedtupleyerel olarak oluşturulan tip size verecektir reprsize 'olabilir t eval), ama asıl fikir buydu.
abarnert

7

str (), son kullanıcı için çıktı oluşturmak için kullanılırken repr (), hata ayıklama geliştirme için kullanılır ve nesnenin yetkilisini temsil eder.

Misal:

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

Çıktıdan repr () öğesinin tarih nesnesinin resmi temsilini gösterdiğini görüyoruz.


3

1) sonucu repr('foo')olan dize 'foo' . Python kabuğunuzda, ifadenin sonucu da bir temsil olarak ifade edilir, bu yüzden esasen görüyorsunuz repr(repr('foo')).

2) evalbir ifadenin sonucunu hesaplar. Sonuç her zaman bir değerdir (sayı, dize veya nesne gibi). Birden çok değişken şu değerlerle aynı değere sahip olabilir:

x = 'foo'
y = x

x ve y şimdi aynı değere işaret etmektedir.

3) Burada ne demek istediğini bilmiyorum. Bir örnek gönderebilir misiniz ve ne görmek istersiniz?


1

Dediğinde

foo = 'bar'
baz(foo)

Eğer geçmezken fooiçin bazişlevi. fooyalnızca bu durumda bir değeri temsil etmek için kullanılan bir addır 'bar've bu değer bazişleve iletilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.