7

W języku Python funkcje takie jak str(), int(), float() itp. Są zwykle używane do przeprowadzania konwersji typów. Jednak wymagają one, abyś wiedział w czasie rozwoju, jaki typ chcesz przekonwertować. Podproblem jakiegoś kodu Pythona, który próbuję napisać, jest następujący:Odbicie w Pythonie i konwersja typów

Biorąc pod uwagę dwie zmienne, foo i bar, znajdź typ foo. (Nie jest to znane w czasie programowania, ponieważ jest to kod ogólny.) Następnie spróbuj przekonwertować bar na dowolny typ foo. Jeśli nie można tego zrobić, wyślij wyjątek.

Na przykład powiedzmy, że wywołujesz funkcję, która wykonuje to conv. Jego podpis będzie wyglądać

def conv(foo, bar) : 
    # Do stuff. 

byłoby nazwać coś takiego:

result = conv(3.14, "2.718") # result is now 2.718, as a float. 

Odpowiedz

11

Zastosowanie foo.__class__ dostać rodzaj foo. Następnie zadzwonić do konwersji pasek do typu foo:

def conv(foo, bar) : 
    return foo.__class__(bar) 

Oczywiście, działa to tylko wtedy, gdy typ foo ma konstruktora, który wie, jak konwertować poprzeczkę.

+0

Imponujący. Nigdy bym nie pomyślał, że to będzie tak łatwe. Zaskakujące (jestem nowy w Pythonie i bliższy metalowym językom) jest to, że działa z wbudowanymi. – dsimcha

+0

Częściowo niepoprawne. foo .__ class__ to tylko typ foo, jeśli foo jest obiektem w nowym stylu. W przeciwnym razie jest to tylko klasa. –

+0

Niepoprawne tylko dlatego, że powiedziałem "typ", gdy klasa byłaby bardziej precyzyjna. Ale potrzebuje tej klasy do tego nawrócenia. A w Pythonie 3 różnica i tak zniknęła. – oefe

16

że byłoby najlepiej:

type(foo)(bar) 
+0

Tylko w Pythonie 3.0. W Pythonie 2.x będzie działać tylko dla "klas nowego stylu" i wbudowanych. – oefe

0
type(foo) 

jest zdecydowanie najlepszy, jeśli chcesz sprawdzić typ następnie „typ” jest najlepszą metodą, a ja jestem na python 2.7 - 3.2.2, type() działa idealnie.

Powiązane problemy