Nie użyłbym repr (myvariable) - często zwraca informacje o typie klasy, adresie pamięci itp. Jest bardziej przydatne do debugowania. Użyj str (myvariable) do konwersji na łańcuch i unicode (zmienna) do konwersji na Unicode.
Abgan,
2
A co z Unicode? Coś takiego str(u'ä')nie zadziała. Jednak repr(u'ä')zadziała.
Rouven B.
1
a co z brakiem i fałszem?
fredless
54
strma na celu utworzenie łańcucha reprezentującego dane obiektu. Jeśli piszesz własną klasę i chcesz strpracować dla siebie, dodaj:
def __str__(self):return"Some descriptive string"
print str(myObj)zadzwoni myObj.__str__().
reprjest podobną metodą, która generalnie generuje informacje o klasie. W przypadku większości podstawowych obiektów bibliotecznych reprtworzy nazwę klasy (i czasami informacje o klasie) w nawiasach ostrych. reprzostanie użyty, na przykład, po prostu wpisując obiekt w panelu interakcji, bez użycia printlub czegokolwiek innego.
Możesz zdefiniować zachowanie reprwłasnych obiektów, tak jak możesz zdefiniować zachowanie str:
Prawdopodobnie prawdą jest, że większość podstawowych obiektów biblioteki według surowego procentu zwraca reprezentację w object.__repr__stylu nawiasów ostrych, ale wiele z najczęściej używanych nie. Ogólna reguła reprjest taka, że jeśli ma sens zwracanie kodu Pythona, który można by ocenić w celu wytworzenia tego samego obiektu, zrób to tak samo str, jak frozensetwiększość innych poleceń wbudowanych, ale jeśli nie, użyj nawiasu kątowego formularz, aby upewnić się, że to, co zwracasz, nie może zostać pomylone z plikiem źródłowym czytelnym dla człowieka i możliwym do oceny.
abarnert
(Oczywiście niektóre wbudowane funkcje naruszają tę praktyczną zasadę - listktóra zawiera samą siebie zwraca coś, co nie tylko wygląda, ale jest kodem możliwym do oceny, co ocenia nieprawidłowo - ale rdzenni deweloperzy nigdy nie traktowali tego jako licencji na rozszerzenie tego samego zachowanie do standardowej biblioteki.)
abarnert
19
Widzę, że wszystkie odpowiedzi zalecają użycie str(object). Może się nie powieść, jeśli twój obiekt ma więcej znaków niż ASCII i zobaczysz błąd podobny do ordinal not in range(128). Tak było w przypadku mnie, gdy konwertowałem listę ciągów w języku innym niż angielski
w Pythonie 3.0 i nowszych, str (obiekt) domyślnie wykonuje unicode
dmjalund
13
str(object) da rade.
Jeśli chcesz zmienić sposób, w jaki obiekt jest określany jako łańcuch, zdefiniuj __str__(self)metodę dla klasy obiektu. Taka metoda musi zwrócić obiekt str lub unicode.
Która metoda jest skuteczna? str(any_var)lubany_var.__str__()
Kedar.Aitawdekar
@ Kedar.Aitawdekar: Nawet jeśli istnieje zauważalna różnica w czasie wykonania (w co wątpię, ale zachęcam do sprawdzenia go za pomocą timeitmodułu), powinieneś użyć, str(any_var)ponieważ jest bardziej czytelny dla ludzi i pozwala korzystać z przypadków, gdy any_vardefiniuje, __repr__()ale nie robi t zdefiniować __str__().
Zwraca łańcuch zawierający ładną, drukowalną reprezentację obiektu. W przypadku ciągów zwraca sam ciąg. Różnica z repr (obiekt) polega na tym, że str (obiekt) nie zawsze próbuje zwrócić łańcuch, który jest akceptowany przez eval (); jego celem jest zwrócenie drukowalnego ciągu. Jeśli nie podano argumentu, zwraca pusty ciąg, „”.
Uważaj, jeśli naprawdę chcesz „zmienić” typ danych. Podobnie jak w innych przypadkach (np. Zmiana iteratora w forpętli) może to spowodować nieoczekiwane zachowanie:
>> dct ={1:3,2:1}>> len(str(dct))12>>print(str(dct)){1:31,2:0}>> l =["all","colours"]>> len(str(l))18
str(var)
? czy tego szukasz?Odpowiedzi:
również alternatywnie spróbuj repr:
Nazywa się to „konwersją” w Pythonie i jest dość powszechne.
źródło
str(u'ä')
nie zadziała. Jednakrepr(u'ä')
zadziała.str
ma na celu utworzenie łańcucha reprezentującego dane obiektu. Jeśli piszesz własną klasę i chceszstr
pracować dla siebie, dodaj:print str(myObj)
zadzwonimyObj.__str__()
.repr
jest podobną metodą, która generalnie generuje informacje o klasie. W przypadku większości podstawowych obiektów bibliotecznychrepr
tworzy nazwę klasy (i czasami informacje o klasie) w nawiasach ostrych.repr
zostanie użyty, na przykład, po prostu wpisując obiekt w panelu interakcji, bez użyciaprint
lub czegokolwiek innego.Możesz zdefiniować zachowanie
repr
własnych obiektów, tak jak możesz zdefiniować zachowaniestr
:>>> myObj
w panelu interakcji lubrepr(myObj)
spowodujemyObj.__repr__()
źródło
object.__repr__
stylu nawiasów ostrych, ale wiele z najczęściej używanych nie. Ogólna regułarepr
jest taka, że jeśli ma sens zwracanie kodu Pythona, który można by ocenić w celu wytworzenia tego samego obiektu, zrób to tak samostr
, jakfrozenset
większość innych poleceń wbudowanych, ale jeśli nie, użyj nawiasu kątowego formularz, aby upewnić się, że to, co zwracasz, nie może zostać pomylone z plikiem źródłowym czytelnym dla człowieka i możliwym do oceny.list
która zawiera samą siebie zwraca coś, co nie tylko wygląda, ale jest kodem możliwym do oceny, co ocenia nieprawidłowo - ale rdzenni deweloperzy nigdy nie traktowali tego jako licencji na rozszerzenie tego samego zachowanie do standardowej biblioteki.)Widzę, że wszystkie odpowiedzi zalecają użycie
str(object)
. Może się nie powieść, jeśli twój obiekt ma więcej znaków niż ASCII i zobaczysz błąd podobny doordinal not in range(128)
. Tak było w przypadku mnie, gdy konwertowałem listę ciągów w języku innym niż angielskiRozwiązałem to za pomocą
unicode(object)
źródło
str(object)
da rade.Jeśli chcesz zmienić sposób, w jaki obiekt jest określany jako łańcuch, zdefiniuj
__str__(self)
metodę dla klasy obiektu. Taka metoda musi zwrócić obiekt str lub unicode.źródło
str(any_var)
lubany_var.__str__()
timeit
modułu), powinieneś użyć,str(any_var)
ponieważ jest bardziej czytelny dla ludzi i pozwala korzystać z przypadków, gdyany_var
definiuje,__repr__()
ale nie robi t zdefiniować__str__()
.Użyj
str
wbudowanego:Przykłady:
Z dokumentacji:
źródło
Z
str(x)
. Jednak każdy typ danych może definiować własną konwersję ciągów, więc może to nie być to, czego chcesz.źródło
Możesz użyć
%s
jak poniżejźródło
Po prostu użyj
str
- na przykład:źródło
Użyj formatowania:
Przykład:
Wyjście: czw. 11 stycznia 2018 r. 20:40:05
źródło
Uważaj, jeśli naprawdę chcesz „zmienić” typ danych. Podobnie jak w innych przypadkach (np. Zmiana iteratora w
for
pętli) może to spowodować nieoczekiwane zachowanie:źródło