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.