2011-08-18 8 views
6

W tłumaczu można po prostu wpisać nazwę obiektu np. lista a = [1, 2, 3, u"hellö"] w wierszu interpretera tak:Jaka jest różnica między `>>> some_object` i` >>> print some_object` w interpretorze Pythona?

>>> a 
[1, 2, 3, u'hell\xf6'] 

lub można zrobić:

>>> print a 
[1, 2, 3, u'hell\xf6'] 

co wydaje ekwiwalent za list. W tej chwili pracuję z hdf5, aby zarządzać niektórymi danymi i zdałem sobie sprawę, że istnieje różnica między dwiema wyżej wymienionymi metodami. Biorąc pod uwagę:

with tables.openFile("tutorial.h5", mode = "w", title = "Some Title") as h5file: 
    group = h5file.createGroup("/", 'node', 'Node information') 
    tables.table = h5file.createTable(group, 'readout', Node, "Readout example") 

Wyjście

print h5file 

różni się od

>>> h5file 

Więc zastanawiałem się, czy ktoś może wyjaśnić różnice behawioralne Pythona w tych dwóch przypadkach?

Odpowiedz

8

Wpisywanie obiektu do terminalu wywołuje __repr__(), który służy do szczegółowego przedstawienia obiektu, który drukujesz (jednoznaczny). Kiedy mówisz coś, aby "wydrukować", dzwonisz pod numer __str__(), a zatem pytasz o coś, co jest czytelne dla człowieka.

Alex Martelli dał wspaniałe wyjaśnienie here. Inne odpowiedzi w wątku mogą również oświetlić różnicę.

Na przykład spójrz na obiekty datetime.

>>> import datetime 
>>> now = datetime.datetime.now() 

Porównaj ...

>>> now 
Out: datetime.datetime(2011, 8, 18, 15, 10, 29, 827606) 

do ...

>>> print now 
Out: 2011-08-18 15:10:29.827606 

Mam nadzieję, że sprawia, że ​​trochę bardziej jasne!

1

Polecenie print zawsze wywołuje metodę , natomiast (tylko w interpreterze interakcyjnym) po prostu wywołując zmienną wywołuje metodę obiektu x.__repr__().

>>> '\x02agh' 
'\x02agh' 
>>> print '\x02agh' 
'agh' 
+0

Gdzie jest to udokumentowane? Nie mogłem go znaleźć. – jtbandes

+0

@jtband Nie wiem gdzie, ale możesz to przetestować samodzielnie. PS: Czy ktoś może poprawnie sformułować kody śródliniowe? To nie działa na urządzeniu mobilnym. Dzięki ! –

+0

Oczywiście mogę to przetestować, nie o to pytam :) – jtbandes

2

Interaktywny interpreter wydrukuje wynik każdego wpisanego w nim wyrażenia. (Ponieważ instrukcje nie są obliczane, ale raczej wykonywane, to zachowanie drukowania nie ma zastosowania do takich samych instrukcji, jak print, pętle itp.)

Dowód, że repr() jest używany przez interaktywnego interpretatora zgodnie z zaleceniami Niklasa Rosensteina (przy użyciu 2,6 tłumacza):

>>> class Foo: 
... def __repr__(self): 
...  return 'repr Foo' 
... def __str__(self): 
...  return 'str Foo' 
... 
>>> x = Foo() 
>>> x 
repr Foo 
>>> print x 
str Foo 

Więc gdy oświadczenie print może być zbędne w interaktywnym interpretera (chyba trzeba str i nie repr), non-interactive interpreter tego nie robi. Umieszczenie powyższego kodu w pliku i uruchomienie pliku spowoduje, że nic nie zostanie wydrukowane.

+0

Tak, x zostanie wydrukowane, ponieważ istnieje instrukcja drukowania;) –

+0

Ha, to zabawne. Redagowałem odpowiedź, dodając instrukcję "print x", aby pokazać, że używa się 'str' i innego' repr' i zapomniałem zmienić ostatni akapit. – wberry

0

Spójrz na dokumentacji Pythona w: http://docs.python.org/reference/datamodel.html#object.repr

obiektu. repr (self)

Called by the repr() built-in function and by string conversions 

(reverse cytaty), aby obliczyć „oficjalne” ciąg znaków reprezentujący obiekt . Jeśli to w ogóle możliwe, powinno to wyglądać jak poprawne wyrażenie Pythona , które może być użyte do odtworzenia obiektu o tej samej wartości (z uwzględnieniem odpowiedniego środowiska). Jeśli nie jest to możliwe, powinien zostać zwrócony łańcuch w postaci < ... jakiś przydatny opis ...>. Wartość zwracana musi być obiektem typu string. Jeśli klasa definiuje repr(), ale nie str(), a następnie repr() jest również stosowany, gdy reprezentacja „nieformalny” ciąg wystąpień tej klasy jest wymagane.

This is typically used for debugging, so it is important that the 

przedstawienie jest bogate w informacje i jednoznaczne. Obiekt

. str (self)

Called by the str() built-in function and by the print statement 

obliczyć „nieformalne” ciąg znaków reprezentujący obiekt. Ten numer różni się od repr() tym, że nie musi być prawidłowym wyrażeniem Python : zamiast tego można użyć bardziej wygodnej lub zwięzłej reprezentacji . Wartość zwracana musi być obiektem typu string.

Przykład:

>>> class A(): 
... def __repr__(self): return "repr!" 
... def __str__(self): return "str!" 
... 
>>> a = A() 
>>> a 
repr! 
>>> print(a) 
str! 
>>> class B(): 
... def __repr__(self): return "repr!" 
... 
>>> class C(): 
... def __str__(self): return "str!" 
... 
>>> b = B() 
>>> b 
repr! 
>>> print(b) 
repr! 
>>> c = C() 
>>> c 
<__main__.C object at 0x7f7162efb590> 
>>> print(c) 
str! 

funkcja druku drukuje konsolę co argumenty __str__. Podobnie jak print(str(obj)).

Jednak w konsoli interaktywnej funkcja zwraca wartość zwracanej funkcji __repr__. A jeśli nie zdefiniowano __str__, można zamiast tego użyć __repr__.

Idealnie, __repr__ oznacza, że ​​powinniśmy po prostu użyć tej reprezentacji do odtworzenia tego obiektu. Nie powinna ona być identyczna między różnymi klasami lub obiektami, które reprezentują różne wartości. Na przykład datetime.time:

Ale __str__ (co otrzymamy z str(obj)) powinno wyglądać dobrze, ponieważ pokazujemy to użytkownikowi.

>>> a = datetime.time(16, 42, 3) 
>>> repr(a) 
'datetime.time(16, 42, 3)' 
>>> str(a) 
'16:42:03' #We dont know what it is could be just print: 
>>> print("'16:42:03'") 
'16:42:03' 

I przepraszam za zły angielski :).

0

print(variable) równa print(str(variable))

natomiast

variable równa print(repr(variable))

Oczywiście, sposób przedmiotu h5file__repr__ i __str__ różne wyniki.