Python'da NoneType nasıl “test edilir”?


398

Bazen bir NoneType değeri döndüren bir yöntem var. Peki bir NoneType olan bir değişkeni nasıl sorgulayabilirim? Eğer yöntem kullanmanız gerekiyor , örneğin

if not new:
    new = '#'

Bunun yanlış yol olduğunu biliyorum ve umarım ne demek istediğimi anlarsın.


Sanırım bu burada ve görünüşte bir yerde daha önce cevaplandı
yorodm

Eğer Nonebunun için sadece değer senin metot bize olan bool(returnValue)eşit False, daha sonra if not new:çalışma cezasına gerektiğini. Bu bazen yerleşik kütüphanelerde gerçekleşir - örneğin, re.matchHiçbiri veya gerçek bir eşleşme nesnesi döndürür.
Kevin

Ayrıca burada python ile ilgili nullve benim cevap bakın . None
Michael Ekoka

Yanıtlar:


631

Peki bir NoneType olan bir değişkeni nasıl sorgulayabilirim?

isOperatörü kullan , böyle

if variable is None:

Neden çalışıyor?

Yana Nonetek tek nesnedir NoneTypePython, kullanabileceğimiz isbir değişken olup olmadığını kontrol etmek için operatöre Noneiçinde ya da değil.

isDokümanlardan alıntı ,

İşleçler isve is notnesne kimliği testi: x is yyalnızca xve yaynı nesne ise ve doğruysa doğrudur . x is not yters doğruluk değeri verir.

Yalnızca bir örneği olabilir beri None, iskontrol etmek tercih yol olacaktır None.


Atın ağzından dinleyin

Python'un Kodlama Stili Kılavuzlarından Alıntı - PEP-008 (birlikte Guido'nun kendisi tarafından tanımlanır),

Tekiz Karşılaştırmalar Seviyorum Nonedaima birlikte yapılmalıdır isyais not , asla eşitlik operatörleri .


Öyleyse == Noneve arasındaki fark is Nonenedir?
NoName

@NoName ile ilgili olarak None, ikisi de benzer sonuç verecektir.
thefourtheye

1
bir pandasDataFrame olup olmadığını karşılaştırarak bu işe yaramaz - bunun için, ben type(df) is type(None)kaçınmak için kullanın :The truth value of a DataFrame is ambiguous
Marc Maxmeister


27

Alex Hall'ın cevabınaisinstance göre de yapılabilir :

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

isinstance aynı zamanda sezgiseldir, ancak çizgiyi gerektirdiği bir komplikasyon vardır

NoneType = type(None)

intve gibi türler için gerekli değildir float.


Alt sınıflayamayacağınız NoneTypeve Nonetek birton isinstanceolduğu için, algılamak için kullanılmamalıdır None- bunun yerine kabul edilen cevabın söylediği gibi yapmalı is Noneveya veya kullanmalısınız is not None.
Aaron Hall

18

Aaron Hall'un yorumunda belirtildiği gibi:

Alt sınıflayamayacağınız NoneTypeve Nonetek birton isinstanceolduğu için, algılamak için kullanılmamalıdır None- bunun yerine kabul edilen cevabın söylediği gibi yapmalı is Noneveya veya kullanmalısınız is not None.


Orijinal Yanıt:

Ancak kakule cevabına ek olarak ekstra bir çizgi olmadan en basit yol muhtemelen:
isinstance(x, type(None))

Peki bir NoneType olan bir değişkeni nasıl sorgulayabilirim? Eğer yöntemi kullanmalıyım

Kullanımı -statement içinde isinstance()bir gerektirmez :isif

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

Ek bilgiler Belgelerde belirtildiği gibi
bir isinstance()ifadede birden çok tür olup olmadığını da kontrol edebilirsiniz . Türleri bir demet olarak yazmanız yeterlidir.

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

1
Alt sınıflayamayacağınız NoneTypeve Nonetek birton isinstanceolduğu için, algılamak için kullanılmamalıdır None- bunun yerine kabul edilen cevabın söylediği gibi yapmalı is Noneveya veya kullanmalısınız is not None.
Aaron Hall

1
Bu cevap için yararlı oldupython 3.6.7
Santhosh Dhaipule Chandrakanth

@AaronHall Neden isinstance olmamalı kullanılacak? Bunun istercih edilmesi gerektiğini anlıyorum , ancak isinstance formunun daha doğal olduğu bazı durumlar var (aynı anda birden fazla türü kontrol etmek gibi isinstance(x, (str, bool, int, type(None)))). Sadece kişisel bir tercih mi, yoksa farkında olmadığım bir uyarı var mı?
Conchylicultor

@ Conchylicultor öneriniz için dezavantaj: 1. küresel typearama 2. sonra onu aramak 3. sonra türünü ararken None- ne zaman Nonebir singleton ve bir anahtar kelime. Başka bir dezavantaj: 4. Bu çok standart değildir ve insanlar kodunuza bakarken kaşları yükseltir. x is Nonedaha optimize edilmiş bir kontroldür. Ben de önerebilirim x is None or isinstance(x, (str, bool, int))- ama aynı zamanda çok fazla ortak olmayan tipler için bu tür bir kontrol yaparken ne yaptığınızı düşünmenizi öneririm ...
Aaron Hall

4

Bunun soruyu cevaplayıp yanıtlamadığından emin değilim. Ama biliyorum ki bu çözmem biraz zaman aldı. Bir web sitesinde dolaşıyordum ve aniden yazarların adı artık orada değildi. Yani bir kontrol ifadesi gerekiyordu.

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

Yazar bu durumda herhangi bir değişken Noneolabilir ve kontrol ettiğiniz herhangi bir tür olabilir.


Yana Nonebir tekil olduğunu typetespit etmek için kullanılmamalıdır Noneyerine kabul edilen cevap dediğini yap ve kullanım olmalıdır - is Noneya is not None.
Aaron Hall

2

Python 2.7:

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

veya

isinstance(None, type(None))

==> Doğru


1
Alt sınıflayamayacağınız NoneTypeve Nonetek birton isinstanceolduğu için, algılamak için kullanılmamalıdır None- bunun yerine kabul edilen cevabın söylediği gibi yapmalı is Noneveya veya kullanmalısınız is not None.
Aaron Hall

Ah tamam! Teşekkürler !
Pesko

0

Umarım bu örnek size yardımcı olacaktır)

print(type(None) # NoneType

Böylece, değişken adının türünü kontrol edebilirsiniz

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.