2014-04-15 12 views
193

Mam metodę, która czasami zwraca wartość NoneType. Więc jak mogę zakwestionować zmienną, która jest typu NoneType? Muszę korzystać jeśli sposób, na przykładJak "testować" NoneType w python?

if not new: 
    new = '#' 

wiem, że jest niewłaściwy sposób i mam nadzieję, że rozumiesz, co mam na myśli.

+0

Myślę, że odpowiedź na to pytanie [tutaj] (http://stackoverflow.com/questions/14247373/python-none-comparison-ould-i-use-is-or) i najwyraźniej gdzieś przed – yorodm

+0

Jeśli "Brak" jest jedyną wartością zwracaną przez twoją metodę, dla której 'bool (returnValue)' równa się 'False', a następnie' if not new: 'powinno działać poprawnie. Zdarza się to czasami w wbudowanych bibliotekach - na przykład ['rematch'] (https://docs.python.org/2/library/re.html#re.match) zwraca wartość None lub jest zgodne z prawdą obiekt. – Kevin

Odpowiedz

302

Jak mogę zakwestionować zmienną typu NoneType?

Zastosowanie is operator, jak to

if variable is None: 

Dlaczego to działa?

Od None jest jedynym obiektem NoneType singleton w Pythonie, możemy użyć is z operatorem, aby sprawdzić, czy zmienna ma None w nim, czy nie.

Cytując is docs,

operatorów is i is not badanie tożsamości obiektu: x is y jest prawdziwe wtedy i tylko wtedy x i y są tego samego obiektu. x is not y daje odwrotną wartość prawdy.

Ponieważ nie może być tylko jedna instancja None, is będzie preferowanym sposobem sprawdzenia None.


usłyszeć od konia usta

Cytowanie Python's Coding Style Guidelines - PEP-008 (wspólnie zdefiniowanego przez samego Guido),

porównań singletons jak None powinny być zawsze wykonane z is lub is not , nigdy operatory równości.

+0

Po prostu użycie 'z = variable is None' działa, jeśli potrzebujesz, nie potrzebujesz warunkowego instrukcji if. –

38
if variable is None: 
    print 'Is None' 

-

if variable is not None: 
    print 'Isn\'t None' 
4

To może być również wykonane z isinstance zgodnie Alex Hall's answer:

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

isinstance jest również intuicyjny, ale nie jest powikłaniem, które wymaga linię

NoneType = type(None)

, która nie jest potrzebna w przypadku typów takich jak int i float.