2013-06-19 19 views
19

W Pythonie masz None Singleton, który działa dość dziwnie w pewnych okolicznościach:Brak Python error/bug?

>>> a = None 
>>> type(a) 
<type 'NoneType'> 
>>> isinstance(a,None) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types 

Więc najpierw, <type 'NoneType'> wyświetlacze że None nie jest typem, ale NoneType jest. Jednak po uruchomieniu isinstance(a,NoneType), reaguje z błędem: NameError: name 'NoneType' is not defined

Teraz, biorąc pod uwagę to, czy masz funkcję z krytym domyślnie wejściowego ustawionym na None i trzeba sprawdzić, należy wykonać następujące czynności:

if variable is None: 
    #do something 
else: 
    #do something 

co jest powodem, że nie mogę zrobić następujące zamiast:

if isinstance(variable,None): #or NoneType 
    #do something 
else: 
    #do something 

jestem po prostu szukasz szczegółowych wyjaśnień, więc mogę lepiej zrozumieć ten

Edit: dobra aplikacja

Powiedzmy chciałem użyć isinstance tak, że mogę coś zrobić jeśli variable jest wiele rodzajów, w tym None:

if isinstance(variable,(None,str,float)): 
    #do something 
+2

'jeśli zmienna == Brak' jest anty-idiomatycznym pythonem. Standardowy sposób wykonania tego testu polega na tym, że 'None' jest singletonem: zamiast niego należy użyć' if variable is None'. –

Odpowiedz

28

Można spróbować:

>>> variable = None 
>>> isinstance(variable,type(None)) 
True 
>>> variable = True 
>>> isinstance(variable,type(None)) 
False 

isinstance trwa 2 argumenty isinstance(object, classinfo) tutaj, przekazując None ustawiania classinfo sobie równych, stąd ten błąd. Musisz podać typ.

4

None jest tylko wartość types.NoneType, to nie jest typ.

a błąd jest wystarczająco jasne:

TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

Z docs:

None is the sole value of types.NoneType . None is frequently used to represent the absence of a value, as when default arguments are not passed to a function.

Można użyć types.NoneType

>>> from types import NoneType 
>>> isinstance(None, NoneType) 
True 

is operatora również działa dobrze:

>>> a = None 
>>> a is None 
True 
22

None nie jest typem, jest pojedynczą instancją samą w sobie - a drugi argument isinstance musi być typem, klasą lub krotką z nich. W związku z tym należy użyć NoneType z types.

from types import NoneType 
print isinstance(None, NoneType) 
print isinstance(None, (NoneType, str, float)) 
 
True 
True 

Chociaż, ja często skłonny zastąpić isinstance(x, (NoneType, str, float)) z x is None or isinstance(x, (str, float)).

+0

Dobra odpowiedź i wyjaśnienie, ale zaakceptowałem karthika, ponieważ nie wymagało to importu. –

+1

@RyanSaxe W porządku, wybaczam ci. Ale jeśli zamierzasz używać 'NoneType' dużo, po prostu zaimportowałbym go z' types'. Wydaje się, że nie trzeba wywoływać 'type (None)', gdy można łatwo uzyskać dostęp do tej wartości. – arshajii

+1

W typach nie występuje odwołanie NoneType. Możesz użyć 'NoneType = type (None)' – Sadik

3

None to wartość (instancja), a nie typ. Jak pokazuje komunikat o błędzie, isinstance oczekuje drugiego argumentu za typ.

Rodzaj Żaden jest type(None) lub Nonetype jeśli zaimportować (from types import NoneType)

Uwaga: idiomatyczne sposób wykonać test jest variable is None. Krótki i opisowy.

Powiązane problemy