Musiałem dwukrotnie wziąć, kiedy to zobaczyłem. Java SE8 zawiera teraz liczby całkowite bez znaku i rozwinąłem tak wiele, że wydaje się grzeszne, że Java nigdy nie miała liczb całkowitych bez znaku przed SE8.
Istnieją dobre i złe sposoby robienia wszystkiego w Pythonie. Oto właściwy sposób:
Posługiwać się type
>>> type(one)<type 'int'>
Możesz użyć tego __name__atrybutu, aby uzyskać nazwę obiektu. (Jest to jeden z niewielu specjalnych atrybutów, do którego musisz użyć __dunder__nazwy, aby uzyskać do niej dostęp - w inspectmodule nie ma nawet metody ).
>>> type(one).__name__
'int'
Nie używaj __class__
W Pythonie nazwy zaczynające się od podkreślników semantycznie nie są częścią publicznego interfejsu API i najlepszym rozwiązaniem dla użytkowników jest unikanie ich używania. (Z wyjątkiem absolutnie niezbędnych).
Ponieważ typedaje nam klasę obiektu, powinniśmy unikać bezpośredniego uzyskania tego. :
>>> one.__class__
Jest to zwykle pierwszy pomysł, jaki ludzie mają podczas uzyskiwania dostępu do typu obiektu w metodzie - już szukają atrybutów, więc typ wydaje się dziwny. Na przykład:
classFoo(object):def foo(self):
self.__class__
Nie rób Zamiast tego wpisz (self):
classFoo(object):def foo(self):
type(self)
Szczegóły implementacji ints i pływaków
Jak mogę zobaczyć typ zmiennej, czy jest ona 32-bitowa bez znaku, 16-bitowa z podpisem itp.?
W Pythonie te szczegóły to szczegóły implementacji. Ogólnie rzecz biorąc, zwykle nie martwimy się tym w Pythonie. Jednak, aby zaspokoić swoją ciekawość ...
W Pythonie 2 liczba int jest zwykle liczbą całkowitą ze znakiem równą szerokości słowa implementacji (ograniczona przez system). To zazwyczaj realizowane jak długo w C . Kiedy liczby całkowite stają się większe, zwykle konwertujemy je na długości Pythona (z nieograniczoną precyzją, nie mylić z długimi literami C).
Na przykład w 32-bitowym Pythonie 2 możemy wywnioskować, że int jest 32-bitową liczbą całkowitą ze znakiem:
>>>import sys
>>> format(sys.maxint,'032b')'01111111111111111111111111111111'>>> format(-sys.maxint -1,'032b')# minimum value, see docs.'-10000000000000000000000000000000'
W Pythonie 3 stary int zniknął, a my po prostu używamy (Python's) jako int, który ma nieograniczoną precyzję.
Możemy również uzyskać informacje o pływakach Pythona, które zwykle są zaimplementowane jako podwójne w C:
Nie używaj __class__semantycznie niepublicznego interfejsu API, aby uzyskać typ zmiennej. Użyj typezamiast tego.
I nie przejmuj się zbytnio szczegółami implementacji Pythona. Sam nie musiałem sobie z tym radzić. Prawdopodobnie też tego nie zrobisz, a jeśli tak, powinieneś wiedzieć wystarczająco dużo, aby nie szukać odpowiedzi na pytanie, co robić.
typ wychodzi, <type instance>ale __class__daje email.message.Message- co robię źle?
Jasen,
@Jasen Czy używasz języka Python 2 i nie dziedziczysz po nim object?
Aaron Hall
tak, po prostu import email nie używam żadnych klas własnego wynalazku.
Jasen
65
print type(variable_name)
Polecam również interaktywny interpreter IPython podczas rozwiązywania takich pytań. Pozwala pisać variable_name?i zwraca całą listę informacji o obiekcie, w tym typ i ciąg doc dla danego typu.
na przykład
In[9]: var =123In[10]: var?Type: int
BaseClass:<type 'int'>StringForm:123Namespace:InteractiveDocstring:
int(x[, base])-> integer
Jeśli to możliwe, przekonwertuj ciąg lub liczbę na liczbę całkowitą. Argument zmiennoprzecinkowy zostanie obcięty w kierunku zera (nie obejmuje ciągu reprezentującego liczbę zmiennoprzecinkową!) Podczas konwersji łańcucha użyj opcjonalnej podstawy. Błędem jest podanie bazy podczas konwertowania nie-ciągu. Jeśli argument znajduje się poza zakresem liczb całkowitych, zostanie zwrócony długi obiekt.
Odp: skomentuj „nazwy zaczynające się od podkreślników ...” (pojedyncze) podkreślenia są bardzo różne niż podwójne podkreślenia („dundery”) i zdecydowanie są częścią publicznego interfejsu API iz pewnością można z nich korzystać. To może być pomocne ... youtu.be/wf-BqAjZb8M
Michał
31
Przykłady prostego sprawdzania typów w Pythonie:
assert type(variable_name)== int
assert type(variable_name)== bool
assert type(variable_name)== list
Myślę, że ta metoda jest lepsza niż funkcja typu do sprawdzania. Jeśli chcesz sprawdzić i działać z wynikiem, musisz spróbować złapać z typem, ale isinstance zwraca true lub false
alkanschtein
24
Pytanie jest nieco dwuznaczne - nie jestem pewien, co rozumiesz przez „widok”. Jeśli próbujesz zapytać o typ rodzimego obiektu Python, odpowiedź @atzz poprowadzi cię we właściwym kierunku.
Jednakże, jeśli starają się generować obiektów Pythona, które mają semantyki C prymitywnych typów (takich jak uint32_t, int16_t), użyj structmodułu. W ten sposób można określić liczbę bitów w danej operacji podstawowej typu C:
Python nie ma takich typów, jakie opisujesz. Istnieją dwa typy reprezentujące wartości całkowite:, intktóra odpowiada typowi int platformy w C, i longktóra jest liczbą całkowitą o dowolnej precyzji (tzn. Rośnie w razie potrzeby i nie ma górnej granicy). ints są po cichu konwertowane, longjeśli wyrażenie daje wynik, którego nie można zapisać int.
To naprawdę zależy od tego, jaki poziom masz na myśli. W Pythonie 2.x istnieją dwa typy liczb całkowitych int(ograniczone do sys.maxint) i long(nieograniczona precyzja) ze względów historycznych. W kodzie Python nie powinno to mieć większego znaczenia, ponieważ interpreter automatycznie konwertuje na długi, gdy liczba jest zbyt duża. Jeśli chcesz wiedzieć o rzeczywistych typach danych używanych w tłumaczu bazowym, zależy to od implementacji. (CPython znajdują się w Objects / intobject.c i Objects / longobject.c.) Aby dowiedzieć się o typach systemów, spójrz na cdleary odpowiedź dotyczącą korzystania z modułu struct.
Po prostu tego nie rób. Pytanie o typ czegoś jest samo w sobie złe. Zamiast tego użyj polimorfizmu. Znajdź lub, jeśli to konieczne, samodzielnie zdefiniuj metodę, która robi to, co chcesz dla każdego możliwego rodzaju danych wejściowych i po prostu wywołaj ją, nie pytając o nic. Jeśli musisz pracować z wbudowanymi typami lub typami zdefiniowanymi przez bibliotekę innej firmy, zawsze możesz dziedziczyć po nich i używać własnych pochodnych. Lub możesz owinąć je w swoją klasę. Jest to zorientowany obiektowo sposób rozwiązywania takich problemów.
Jeśli nalegasz na sprawdzenie dokładnego typu i umieszczenie niektórych brudnych ifplików tu i tam, możesz użyć __class__właściwości lub typefunkcji, aby to zrobić, ale wkrótce przekonasz się, że aktualizujesz te wszystkie ifdodatkowe przypadki co dwa lub trzy zatwierdzenia. Wykonanie tego w sposób OO zapobiega temu i pozwala tylko zdefiniować nową klasę dla nowego typu danych wejściowych.
Odpowiedzi:
Użyj
type()
wbudowanej funkcji:Aby sprawdzić, czy zmienna jest danego typu, użyj
isinstance
:Zauważ, że Python nie ma tego samego typu co C / C ++, który wydaje się być Twoim pytaniem.
źródło
Być może szukasz wbudowanej funkcji .
type()
Zobacz poniższe przykłady, ale w Pythonie nie ma typu „bez znaku”, takiego jak Java.
Dodatnia liczba całkowita:
Duża dodatnia liczba całkowita:
Ujemna liczba całkowita:
Dosłowna sekwencja znaków:
Liczba całkowita zmiennoprzecinkowa:
źródło
To takie proste. Robisz to w ten sposób.
źródło
Więc jeśli masz zmienną, na przykład:
Chcesz poznać jego typ?
Istnieją dobre i złe sposoby robienia wszystkiego w Pythonie. Oto właściwy sposób:
Posługiwać się
type
Możesz użyć tego
__name__
atrybutu, aby uzyskać nazwę obiektu. (Jest to jeden z niewielu specjalnych atrybutów, do którego musisz użyć__dunder__
nazwy, aby uzyskać do niej dostęp - winspect
module nie ma nawet metody ).Nie używaj
__class__
W Pythonie nazwy zaczynające się od podkreślników semantycznie nie są częścią publicznego interfejsu API i najlepszym rozwiązaniem dla użytkowników jest unikanie ich używania. (Z wyjątkiem absolutnie niezbędnych).
Ponieważ
type
daje nam klasę obiektu, powinniśmy unikać bezpośredniego uzyskania tego. :Jest to zwykle pierwszy pomysł, jaki ludzie mają podczas uzyskiwania dostępu do typu obiektu w metodzie - już szukają atrybutów, więc typ wydaje się dziwny. Na przykład:
Nie rób Zamiast tego wpisz (self):
Szczegóły implementacji ints i pływaków
W Pythonie te szczegóły to szczegóły implementacji. Ogólnie rzecz biorąc, zwykle nie martwimy się tym w Pythonie. Jednak, aby zaspokoić swoją ciekawość ...
W Pythonie 2 liczba int jest zwykle liczbą całkowitą ze znakiem równą szerokości słowa implementacji (ograniczona przez system). To zazwyczaj realizowane jak długo w C . Kiedy liczby całkowite stają się większe, zwykle konwertujemy je na długości Pythona (z nieograniczoną precyzją, nie mylić z długimi literami C).
Na przykład w 32-bitowym Pythonie 2 możemy wywnioskować, że int jest 32-bitową liczbą całkowitą ze znakiem:
W Pythonie 3 stary int zniknął, a my po prostu używamy (Python's) jako int, który ma nieograniczoną precyzję.
Możemy również uzyskać informacje o pływakach Pythona, które zwykle są zaimplementowane jako podwójne w C:
Wniosek
Nie używaj
__class__
semantycznie niepublicznego interfejsu API, aby uzyskać typ zmiennej. Użyjtype
zamiast tego.I nie przejmuj się zbytnio szczegółami implementacji Pythona. Sam nie musiałem sobie z tym radzić. Prawdopodobnie też tego nie zrobisz, a jeśli tak, powinieneś wiedzieć wystarczająco dużo, aby nie szukać odpowiedzi na pytanie, co robić.
źródło
<type instance>
ale__class__
dajeemail.message.Message
- co robię źle?object
?import email
nie używam żadnych klas własnego wynalazku.Polecam również interaktywny interpreter IPython podczas rozwiązywania takich pytań. Pozwala pisać
variable_name?
i zwraca całą listę informacji o obiekcie, w tym typ i ciąg doc dla danego typu.na przykład
Jeśli to możliwe, przekonwertuj ciąg lub liczbę na liczbę całkowitą. Argument zmiennoprzecinkowy zostanie obcięty w kierunku zera (nie obejmuje ciągu reprezentującego liczbę zmiennoprzecinkową!) Podczas konwersji łańcucha użyj opcjonalnej podstawy. Błędem jest podanie bazy podczas konwertowania nie-ciągu. Jeśli argument znajduje się poza zakresem liczb całkowitych, zostanie zwrócony długi obiekt.
źródło
print type(str)
zwraca błąd w Pythonie 3.6. Użyjtype(str)
print(type(str))
print type(var)
błędny kod.źródło
Jeszcze jeden sposób, używając
__class__
:źródło
Przykłady prostego sprawdzania typów w Pythonie:
źródło
To może być trochę nieistotne. ale możesz sprawdzać typy obiektów za pomocą,
isinstance(object, type)
jak wspomniano tutaj .źródło
Pytanie jest nieco dwuznaczne - nie jestem pewien, co rozumiesz przez „widok”. Jeśli próbujesz zapytać o typ rodzimego obiektu Python, odpowiedź @atzz poprowadzi cię we właściwym kierunku.
Jednakże, jeśli starają się generować obiektów Pythona, które mają semantyki C prymitywnych typów (takich jak
uint32_t
,int16_t
), użyjstruct
modułu. W ten sposób można określić liczbę bitów w danej operacji podstawowej typu C:Znajduje to również odzwierciedlenie w
array
module, który może tworzyć tablice tych typów niższego poziomu:Maksymalna obsługiwana liczba całkowita (Python 2's
int
) jest podana przez sys.maxint .Istnieje również sys.getsizeof , który zwraca rzeczywisty rozmiar obiektu Python w pozostałej pamięci:
W przypadku danych zmiennoprzecinkowych i precyzyjnych użyj sys.float_info :
źródło
Masz na myśli w Pythonie lub używasz ctypów ?
W pierwszym przypadku po prostu nie możesz - ponieważ Python nie ma podpisanych / niepodpisanych liczb całkowitych 16/32 bitowych.
W drugim przypadku możesz użyć
type()
:Więcej informacji na temat ctypów i ich typów można znaleźć w oficjalnej dokumentacji .
źródło
Python nie ma takich typów, jakie opisujesz. Istnieją dwa typy reprezentujące wartości całkowite:,
int
która odpowiada typowi int platformy w C, ilong
która jest liczbą całkowitą o dowolnej precyzji (tzn. Rośnie w razie potrzeby i nie ma górnej granicy).int
s są po cichu konwertowane,long
jeśli wyrażenie daje wynik, którego nie można zapisaćint
.źródło
Prosty, dla Pythona 3.4 i nowszych
Python 2.7 i nowszy
źródło
To naprawdę zależy od tego, jaki poziom masz na myśli. W Pythonie 2.x istnieją dwa typy liczb całkowitych
int
(ograniczone dosys.maxint
) ilong
(nieograniczona precyzja) ze względów historycznych. W kodzie Python nie powinno to mieć większego znaczenia, ponieważ interpreter automatycznie konwertuje na długi, gdy liczba jest zbyt duża. Jeśli chcesz wiedzieć o rzeczywistych typach danych używanych w tłumaczu bazowym, zależy to od implementacji. (CPython znajdują się w Objects / intobject.c i Objects / longobject.c.) Aby dowiedzieć się o typach systemów, spójrz na cdleary odpowiedź dotyczącą korzystania z modułu struct.źródło
W przypadku python2.x użyj
W przypadku python3.x użyj
źródło
Po prostu tego nie rób. Pytanie o typ czegoś jest samo w sobie złe. Zamiast tego użyj polimorfizmu. Znajdź lub, jeśli to konieczne, samodzielnie zdefiniuj metodę, która robi to, co chcesz dla każdego możliwego rodzaju danych wejściowych i po prostu wywołaj ją, nie pytając o nic. Jeśli musisz pracować z wbudowanymi typami lub typami zdefiniowanymi przez bibliotekę innej firmy, zawsze możesz dziedziczyć po nich i używać własnych pochodnych. Lub możesz owinąć je w swoją klasę. Jest to zorientowany obiektowo sposób rozwiązywania takich problemów.
Jeśli nalegasz na sprawdzenie dokładnego typu i umieszczenie niektórych brudnych
if
plików tu i tam, możesz użyć__class__
właściwości lubtype
funkcji, aby to zrobić, ale wkrótce przekonasz się, że aktualizujesz te wszystkieif
dodatkowe przypadki co dwa lub trzy zatwierdzenia. Wykonanie tego w sposób OO zapobiega temu i pozwala tylko zdefiniować nową klasę dla nowego typu danych wejściowych.źródło