Bagaimana cara "menguji" NoneType dengan python?

398

Saya memiliki metode yang terkadang mengembalikan nilai NoneType. Jadi, bagaimana saya bisa mempertanyakan variabel yang merupakan NoneType? Saya perlu menggunakan metode if , misalnya

if not new:
    new = '#'

Saya tahu itu cara yang salah dan saya harap Anda mengerti apa yang saya maksud.

CrveniZg
sumber
Saya pikir ini dijawab di sini dan tampaknya di suatu tempat sebelumnya
yorodm
Jika Nonehanya nilai yang dikembalikan metode Anda yang bool(returnValue)sama dengan itu False, maka Anda if not new:harus bekerja dengan baik. Ini kadang-kadang terjadi di lib bawaan - misalnya, re.matchmengembalikan None atau objek pencocokan yang benar.
Kevin
Lihat juga jawaban saya tentang nulldan Nonedengan python di sini .
Michael Ekoka

Jawaban:

631

Jadi, bagaimana saya bisa mempertanyakan variabel yang merupakan NoneType?

Gunakan isoperator, seperti ini

if variable is None:

Kenapa ini berhasil?

Karena Nonemerupakan objek tunggal tunggal NoneTypedalam Python, kita dapat menggunakan isoperator untuk memeriksa apakah suatu variabel memilikiNone di dalamnya atau tidak.

Mengutip dari isdokumen ,

Operator isdan is notuji untuk identitas objek: x is ybenar jika dan hanya jika xdan yadalah objek yang sama. x is not ymenghasilkan nilai kebenaran terbalik.

Karena hanya ada satu contoh None, isakan menjadi cara yang lebih disukai untuk memeriksa None.


Dengarkan dari mulut kuda

Mengutip Pedoman Gaya Pengodean Python - PEP-008 (secara bersama-sama didefinisikan oleh Guido sendiri),

Perbandingan dengan orang lajang seperti Noneharus selalu dilakukan dengan isatauis not , tidak pernah dengan operator kesetaraan .

thethourtheye
sumber
Jadi apa bedanya antara == Nonedan is None?
NoName
@NoName Sehubungan dengan None, keduanya akan menghasilkan hasil yang serupa.
theourtheye
2
ini tidak berfungsi jika membandingkan apakah pandasada DataFrame - untuk itu, saya gunakan type(df) is type(None)untuk menghindari:The truth value of a DataFrame is ambiguous
Marc Maxmeister
74
if variable is None:
   ...

if variable is not None:
   ...
elhoucine
sumber
27

Ini juga dapat dilakukan isinstancesesuai dengan jawaban Alex Hall :

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

isinstance juga intuitif tetapi ada komplikasi yang memerlukan garis

NoneType = type(None)

yang tidak diperlukan untuk tipe suka intdan float.

kapulaga
sumber
Karena Anda tidak dapat membuat subkelas NoneTypedan karena itu Noneadalah singleton, isinstancesebaiknya tidak digunakan untuk mendeteksi None- sebaliknya Anda harus melakukan seperti yang diterima oleh jawaban, dan gunakan is Noneatau is not None.
Aaron Hall
18

Seperti yang ditunjukkan oleh komentar Aaron Hall:

Karena Anda tidak dapat membuat subkelas NoneTypedan karena itu Noneadalah singleton, isinstancesebaiknya tidak digunakan untuk mendeteksi None- sebaliknya Anda harus melakukan seperti yang diterima oleh jawaban, dan gunakan is Noneatau is not None.


Jawaban asli:

Namun, cara paling sederhana, tanpa garis tambahan selain jawaban kapulaga mungkin:
isinstance(x, type(None))

Jadi, bagaimana saya bisa mempertanyakan variabel yang merupakan NoneType? Saya perlu menggunakan metode if

Menggunakan isinstance()tidak memerlukan suatu pernyataan- isdalam if:

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

Informasi tambahan
Anda juga dapat memeriksa beberapa jenis dalam satu isinstance()pernyataan sebagaimana disebutkan dalam dokumentasi . Cukup tulis jenis sebagai tuple.

isinstance(x, (type(None), bytes))
Martin Müsli
sumber
1
Karena Anda tidak dapat membuat subkelas NoneTypedan karena itu Noneadalah singleton, isinstancesebaiknya tidak digunakan untuk mendeteksi None- sebaliknya Anda harus melakukan seperti yang diterima oleh jawaban, dan gunakan is Noneatau is not None.
Aaron Hall
1
Jawaban ini bermanfaat untukpython 3.6.7
Santhosh Dhaipule Chandrakanth
@ Harunall Mengapa isinstance tidak digunakan? Saya mengerti bahwa isseharusnya lebih disukai, tetapi ada beberapa kasus di mana bentuk isinst merasa lebih alami (seperti memeriksa beberapa jenis sekaligus isinstance(x, (str, bool, int, type(None)))). Apakah ini hanya pilihan pribadi atau ada peringatan yang tidak saya sadari?
Conchylicultor
@Conchylicultor tidak setuju dengan saran Anda: 1. pencarian global untuk type2. kemudian memanggilnya 3. lalu mencari jenis None- kapan Nonekeduanya singleton dan kata kunci. Kelemahan lain: 4. ini sangat tidak standar dan akan menaikkan alis ketika orang melihat kode Anda. x is Noneadalah pemeriksaan yang lebih optimal. Saya akan menyarankan x is None or isinstance(x, (str, bool, int))- tetapi saya juga akan menyarankan Anda berpikir lebih banyak tentang apa yang Anda lakukan ketika Anda melakukan jenis memeriksa jenis yang tidak memiliki banyak kesamaan ...
Aaron Hall
4

Tidak yakin apakah ini menjawab pertanyaan. Tapi saya tahu ini perlu waktu untuk mencari tahu. Saya sedang menelusuri situs web dan tiba-tiba nama penulis tidak ada lagi. Jadi diperlukan pernyataan cek.

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

Penulis dapat berupa variabel apa pun dalam kasus ini, dan None dapat berupa jenis apa pun yang Anda periksa.

Joshua Pachner
sumber
Karena Nonesingleton, typesebaiknya tidak digunakan untuk mendeteksi None- sebaliknya Anda harus melakukan seperti yang diterima, dan menggunakan is Noneatau is not None.
Aaron Hall
2

Python 2.7:

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

atau

isinstance(None, type(None))

==> Benar

Pesko
sumber
1
Karena Anda tidak dapat membuat subkelas NoneTypedan karena itu Noneadalah singleton, isinstancesebaiknya tidak digunakan untuk mendeteksi None- sebaliknya Anda harus melakukan seperti yang diterima oleh jawaban, dan gunakan is Noneatau is not None.
Aaron Hall
Oh oke! Terima kasih!
Pesko
0

Semoga contoh ini bermanfaat bagi Anda)

print(type(None) # NoneType

Jadi, Anda dapat memeriksa jenis nama variabel

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
alexmosk25
sumber