Jak „przetestować” NoneType w pythonie?


398

Mam metodę, która czasami zwraca wartość NoneType. Jak mogę zakwestionować zmienną, która jest typu NoneType? Na przykład muszę użyć metody if

if not new:
    new = '#'

Wiem, że to zły sposób i mam nadzieję, że rozumiesz, co miałem na myśli.


Myślę, że odpowiedź na to pytanie
padła

Jeśli Nonejest to jedyna wartość, którą zwraca metoda, dla której bool(returnValue)jest równa False, to if not new:powinna działać dobrze. Zdarza się to czasami we wbudowanych bibliotekach re.matchlib - na przykład zwraca wartość Brak lub obiekt zgodny z prawdą.
Kevin

Zobacz także moją odpowiedź na temat nulli Nonew Pythonie tutaj .
Michael Ekoka,

Odpowiedzi:


631

Jak mogę zakwestionować zmienną, która jest typu NoneType?

Użyj isoperatora, tak jak to

if variable is None:

Dlaczego to działa?

Ponieważ Nonejest to jedyny obiekt typu singleton NoneTypew Pythonie, możemy użyć isoperatora do sprawdzenia, czy zmienna ma Nonew sobie czy nie.

Cytując z isdokumentów ,

Operatorzy isi is nottesty do identyfikacji obiektu: x is yjest prawdziwe wtedy i tylko wtedy x, a yto ten sam obiekt. x is not ydaje odwrotną wartość prawdy.

Ponieważ może istnieć tylko jedna instancja None, isbyłby to preferowany sposób sprawdzenia None.


Usłysz to z pyska konia

Cytując Wytyczne dotyczące stylu kodowania Pythona - PEP-008 (wspólnie zdefiniowane przez samego Guido),

Porównania do pojedynczych lubię Nonezawsze powinny być wykonane z islubis not , nigdy operatorów równości .


Jaka jest różnica między == Nonei is None?
NoName,

@NoName W odniesieniu do None, oba przyniosą podobny wynik.
theourourhehe

1
nie działa to, jeśli porównuję, czy pandasDataFrame istnieje - w tym type(df) is type(None)celu The truth value of a DataFrame is ambiguous
unikam


27

Można to również zrobić isinstancezgodnie z odpowiedzią Alexa Halla :

>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True

isinstance jest również intuicyjny, ale istnieje komplikacja, że ​​wymaga linii

NoneType = type(None)

co nie jest potrzebne dla typów takich jak inti float.


Ponieważ nie można podklasować, NoneTypea ponieważ Nonejest to singleton, isinstancenie należy go używać do wykrywania None- zamiast tego należy postępować zgodnie z przyjętą odpowiedzią i użyć is Nonelub is not None.
Aaron Hall

18

Jak zauważył komentarz Aarona Halla:

Ponieważ nie można podklasować, NoneTypea ponieważ Nonejest to singleton, isinstancenie należy go używać do wykrywania None- zamiast tego należy postępować zgodnie z przyjętą odpowiedzią i użyć is Nonelub is not None.


Oryginalna odpowiedź:

Najprostszym sposobem jednak bez dodatkowej linii oprócz odpowiedzi na kardamon jest prawdopodobnie:
isinstance(x, type(None))

Jak mogę zakwestionować zmienną, która jest typu NoneType? Muszę użyć metody if

Używanie isinstance()nie wymaga iswewnątrz if-statement:

if isinstance(x, type(None)): 
    #do stuff

Informacje dodatkowe
Można również sprawdzić, czy w jednym isinstance()wyciągu jest wiele typów, jak wspomniano w dokumentacji . Po prostu napisz typy jako krotkę.

isinstance(x, (type(None), bytes))

1
Ponieważ nie można podklasować, NoneTypea ponieważ Nonejest to singleton, isinstancenie należy go używać do wykrywania None- zamiast tego należy postępować zgodnie z przyjętą odpowiedzią i użyć is Nonelub is not None.
Aaron Hall

1
Ta odpowiedź była przydatna dlapython 3.6.7
Santhosh Dhaipule Chandrakanth,

@AaronHall Dlaczego isinstance nie należy używać? Rozumiem, że isnależy to preferować, ale są przypadki, w których formularz isinstance wydaje się bardziej naturalny (np. Sprawdzanie wielu typów jednocześnie isinstance(x, (str, bool, int, type(None)))). Czy to tylko osobiste preferencje, czy jest jakieś zastrzeżenie, którego nie jestem świadomy?
Conchylicultor

@ Conchylicultor wady Twojej sugestii: 1. globalne wyszukiwanie dla type2., a następnie wywołanie go 3. następnie wyszukiwanie typu None- kiedy Nonejest singletonem i słowem kluczowym. Kolejny minus: 4. jest to bardzo niestandardowe i podniesie brwi, gdy ludzie patrzą na twój kod. x is Nonejest bardziej zoptymalizowanym czekiem. Sugerowałbym x is None or isinstance(x, (str, bool, int))- ale sugerowałbym również, abyś pomyślał więcej o tym, co robisz, gdy robisz tego rodzaju sprawdzanie typów, które nie mają ze sobą wiele wspólnego ...
Aaron Hall

4

Nie jestem pewien, czy to odpowiada na pytanie. Ale wiem, że zrozumienie tego zajęło mi trochę czasu. Przeglądałem stronę internetową i nagle nie było już nazwiska autorów. Potrzebowałem więc wyciągu z czeku.

if type(author) == type(None):
     my if body
else:
    my else body

Autor może być dowolną zmienną w tym przypadku i Nonemoże być dowolnego typu, którego szukasz.


Ponieważ Nonejest to singleton, typenie należy go używać do wykrywania None- zamiast tego należy postępować zgodnie z przyjętą odpowiedzią i użyć is Nonelub is not None.
Aaron Hall

2

Python 2.7:

x = None
isinstance(x, type(None))

lub

isinstance(None, type(None))

==> Prawda


1
Ponieważ nie można podklasować, NoneTypea ponieważ Nonejest to singleton, isinstancenie należy go używać do wykrywania None- zamiast tego należy postępować zgodnie z przyjętą odpowiedzią i użyć is Nonelub is not None.
Aaron Hall

Oh ok Dzięki !
Pesko,

0

Mam nadzieję, że ten przykład będzie dla ciebie pomocny)

print(type(None) # NoneType

Możesz więc sprawdzić typ nazwy zmiennej

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.