Dengan python, bagaimana cara memeriksa apakah suatu objek adalah objek generator?
Mencoba ini -
>>> type(myobject, generator)
memberikan kesalahan -
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'generator' is not defined
(Saya tahu saya dapat memeriksa apakah objek memiliki next
metode untuk menjadi generator, tetapi saya ingin beberapa cara menggunakan yang saya dapat menentukan jenis objek apa pun, bukan hanya generator.)
from types import GeneratorType;type(myobject, GeneratorType)
akan memberi Anda hasil yang tepat untuk objek 'generator' kelas. Tetapi seperti yang ditunjukkan oleh Daenyth, itu belum tentu cara yang tepat untuk pergi.__next__
, Anda sebenarnya menerima iterator apa pun, bukan hanya generator - yang sangat mungkin apa yang Anda inginkan.Jawaban:
Anda dapat menggunakan GeneratorType dari jenis:
sumber
isinstance(gen, (types.GeneratorType, map, filter))
bermanfaat juga mendeteksimap
danfilter
. Ini masih belum termasuk iterables dan iterators lainnya.Maksud Anda fungsi generator? gunakan
inspect.isgeneratorfunction
.EDIT:
jika Anda menginginkan objek generator, Anda dapat menggunakan inspect.isgenerator seperti yang ditunjukkan oleh JAB dalam komentarnya.
sumber
inspect.isgenerator
.inspect.isgenerator
hanya singkatan untuk:isinstance(object, types.GeneratorType)
.Saya pikir penting untuk membuat perbedaan antara fungsi generator dan generator (hasil fungsi generator):
memanggil generator_function tidak akan menghasilkan hasil normal, bahkan tidak akan mengeksekusi kode apa pun dalam fungsi itu sendiri, hasilnya akan menjadi objek khusus yang disebut generator :
jadi ini bukan fungsi generator, tapi generator:
dan fungsi generator bukan generator:
hanya untuk referensi, panggilan fungsi tubuh yang sebenarnya akan terjadi dengan mengkonsumsi generator, misalnya:
Lihat juga Dalam python apakah ada cara untuk memeriksa apakah suatu fungsi merupakan "fungsi generator" sebelum memanggilnya?
sumber
The
inspect.isgenerator
Fungsi baik-baik saja jika Anda ingin memeriksa generator murni (yaitu objek dari "generator" kelas). Namun itu akan kembaliFalse
jika Anda memeriksa, misalnya,izip
iterable. Cara alternatif untuk memeriksa generator yang umum adalah dengan menggunakan fungsi ini:sumber
x=iter([1,2])
. Menurut saya itu benar-benar menguji apakah suatu objek adalah iterator , bukan generator. Tapi mungkin "iterator" persis seperti yang Anda maksud dengan "generator yang digeneralisasi".Anda bisa menggunakan Iterator atau lebih spesifik, Generator dari modul pengetikan .
hasil:
sumber
typing.TypeVar
kelas tampaknya mencegah penggunaanisinstance
bersama dengantyping
modul: "Pada saat runtime,isinstance(x, T)
akan meningkatTypeError
. Secara umum,isinstance()
danissubclass()
tidak boleh digunakan dengan tipe."sumber
Jangan lakukan ini. Itu hanya ide yang sangat, sangat buruk.
Sebaliknya, lakukan ini:
Dalam hal tidak mungkin bahwa tubuh for for loop juga memiliki
TypeError
s, ada beberapa pilihan: (1) menentukan fungsi untuk membatasi ruang lingkup kesalahan, atau (2) menggunakan blok percobaan bersarang .Atau (3) sesuatu seperti ini untuk membedakan semua ini
TypeError
yang beredar.Atau (4) perbaiki bagian lain dari aplikasi Anda untuk menyediakan generator dengan tepat. Itu seringkali lebih sederhana dari semua ini.
sumber
if
pernyataan. Dan. Optimalisasi mikro semacam itu hanya buang-buang waktu saja. Perbaiki algoritma yang menghasilkan kantung iterator dan non-iterator campuran untuk menghasilkan iterator saja dan selamatkan diri Anda dari semua rasa sakit ini.Jika Anda menggunakan server web tornado atau sejenisnya, Anda mungkin menemukan bahwa metode server sebenarnya adalah generator dan bukan metode. Ini membuatnya sulit untuk memanggil metode lain karena hasil tidak bekerja di dalam metode dan karena itu Anda perlu mulai mengelola kumpulan objek generator yang dirantai. Metode sederhana untuk mengelola kumpulan generator berantai adalah dengan membuat fungsi bantuan seperti
Sekarang menulis generator berantai seperti
Menghasilkan output
Yang mungkin adalah apa yang Anda inginkan jika Anda ingin menggunakan generator sebagai alternatif atau sejenisnya.
sumber
(Saya tahu ini adalah posting lama.) Tidak perlu mengimpor modul, Anda dapat mendeklarasikan objek untuk perbandingan di awal program:
sumber