Określ typ obiektu Python
Określ typ obiektu za pomocą type
>>> obj = object()
>>> type(obj)
<class 'object'>
Chociaż działa, unikaj podwójnych atrybutów podkreślenia, takich jak __class__
- nie są one semantycznie publiczne, i chociaż być może nie w tym przypadku, wbudowane funkcje zwykle działają lepiej.
>>> obj.__class__ # avoid this!
<class 'object'>
sprawdzanie typu
Czy istnieje prosty sposób ustalenia, czy zmienna jest listą, słownikiem czy czymś innym? Otrzymuję z powrotem obiekt, który może być dowolnego typu i muszę być w stanie odróżnić.
Cóż, to inne pytanie, nie używaj tekstu - użyj isinstance
:
def foo(obj):
"""given a string with items separated by spaces,
or a list or tuple,
do something sensible
"""
if isinstance(obj, str):
obj = str.split()
return _foo_handles_only_lists_or_tuples(obj)
Obejmuje to przypadek, w którym użytkownik może robić coś sprytnego lub sensownego przez podklasowanie str
- zgodnie z zasadą substytucji Liskova, chcesz mieć możliwość korzystania z instancji podklasy bez łamania kodu - i isinstance
obsługuje to.
Użyj abstrakcji
Co więcej, możesz poszukać konkretnej abstrakcyjnej klasy bazowej z collections
lub numbers
:
from collections import Iterable
from numbers import Number
def bar(obj):
"""does something sensible with an iterable of numbers,
or just one number
"""
if isinstance(obj, Number): # make it a 1-tuple
obj = (obj,)
if not isinstance(obj, Iterable):
raise TypeError('obj must be either a number or iterable of numbers')
return _bar_sensible_with_iterable(obj)
Lub po prostu nie zaznaczaj wyraźnie typu
Lub, co najlepsze, użyj kaczych pism i nie sprawdzaj bezpośrednio swojego kodu. Pisanie na kaczkach obsługuje substytucję Liskova z większą elegancją i mniej gadatliwością.
def baz(obj):
"""given an obj, a dict (or anything with an .items method)
do something sensible with each key-value pair
"""
for key, value in obj.items():
_baz_something_sensible(key, value)
Wniosek
- Służy
type
do uzyskania klasy instancji.
- Służy
isinstance
do jawnego sprawdzania rzeczywistych podklas lub zarejestrowanych abstrakcji.
- I po prostu unikaj sprawdzania typu tam, gdzie ma to sens.