Jak sprawdzić typ danych w Pythonie (typ vs isinstance)

Dowiedz się, jak sprawdzać typy danych w Pythonie. Dowiedz się, kiedy używać type() a kiedy isinstance(), obsługuj klasy niestandardowe i pisz bezpieczne sprawdzanie poprawności typu.

Wypróbuj to rozwiązanie w Edytorze

Przegląd

Python jest językiem dynamicznie typowanym, co oznacza, że zmienne mogą przechowywać wartości dowolnego typu danych, a ich typ może zmieniać się podczas wykonywania. Chociaż ta elastyczność przyspiesza początkowe programowanie, wymaga również sprawdzenia typów zmiennych w czasie wykonywania przed uruchomieniem operacji specyficznych dla typu, takich jak wykonywanie arytmetyki na liczbach całkowitych lub wywoływanie metod łańcuchowych.

Aby sprawdzić typ danych obiektu, Python udostępnia dwie podstawowe funkcje: „type()” i „isinstance()”. Funkcja `type(obj)` zwraca dokładny typ klasy obiektu. Chociaż możesz użyć `type(obj) == int` do sprawdzenia, czy liczba jest liczbą całkowitą, ta metoda jest generalnie odradzana, ponieważ nie obsługuje struktur dziedziczenia (podklasa liczby całkowitej dałaby wartość `False`).

Zalecanym, Pythonicznym sposobem sprawdzania typów jest `isinstance(obj, class_info)`. Ta funkcja sprawdza, czy obiekt jest instancją określonej klasy lub jakiejś podklasy z niej odziedziczonej. Obsługuje także sprawdzanie krotki klas (np. `isinstance(value, (int, float))`), dzięki czemu kod walidacyjny jest bardzo elastyczny i solidny.

Dane wyjściowe kodu i wykonania

Ten skrypt demonstruje sprawdzanie typów zmiennych przy użyciu funkcji type() i isinstance(), pokazując różnice w dziedziczeniu.

check_type.py
Spróbuj w Edytorze
value_int = 42
value_str = "hello"

# 1. Checking type using isinstance() (Recommended)
is_number = isinstance(value_int, int)
print(f"Is {value_int} an int? {is_number}")

# Checking against multiple possible types
is_num_or_str = isinstance(value_str, (int, float, str))
print(f"Is '{value_str}' int, float, or str? {is_num_or_str}")

# 2. Checking type using type() (For exact class matches)
print(f"Exact type of value_int: {type(value_int).__name__}")
print("Is value_int exactly an int?", type(value_int) is int)

# 3. Inheritance difference
class CustomList(list):
    pass

my_list = CustomList([1, 2, 3])

print("\nInheritance testing:")
print("isinstance(my_list, list):", isinstance(my_list, list))
print("type(my_list) is list:", type(my_list) is list)
Wyjście terminala
Is 42 an int? True
Is 'hello' int, float, or str? True
Exact type of value_int: int
Is value_int exactly an int? True

Inheritance testing:
isinstance(my_list, list): True
type(my_list) is list: False

Wdrażanie krok po kroku

  • Użyj isinstance(zmienna, nazwa_typu) do ogólnego sprawdzania typu (zgodnie z dziedziczeniem).
  • Przekaż krotkę typów, takich jak isinstance(variable, (int, float)), aby sprawdzić wiele klas.
  • Użyj type(variable) to type_name tylko wtedy, gdy musisz zagwarantować dokładne dopasowanie klasy, ignorując podklasy.

Często zadawane pytania

Dlaczego funkcja isinstance() jest preferowana zamiast type()?

isinstance() obsługuje dziedziczenie obiektów i polimorfizm. Jeśli podklasujesz typ wbudowany, funkcja isinstance() poprawnie rozpozna go jako instancję klasy nadrzędnej, podczas gdy type() zwróci wartość False.

Jak mogę sprawdzić, czy obiekt można wywołać (jak funkcja)?

Użyj wbudowanej funkcji callable(), która zwraca True, jeśli obiekt można wywołać jak funkcję.

Powiązane tematy

Polecane zasoby Pythona

Poszerzaj swoją wiedzę dzięki powiązanym interaktywnym samouczkom, ściągawkom i porównaniom kodów.