Питондағы объект генератор болып табылатынын қалай тексеруге болады?

Питонда объектінің генераторлық объект болып табылатынын қалай тексеруге болады?

Тәжірибе -

 >>> type(myobject, generator) 

қате береді -

 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'generator' is not defined 

(Мен объектінің генератор ретінде next әдісі бар-жоғын тексере алатынымды білемін, бірақ мен оны генераторларға ғана емес, кез-келген нысанның түрін анықтау үшін қолданамын дегім келеді).

115
20 июня '11 в 22:42 2011-06-20 22:42 «Пушпак Дагеде» 20 маусымда сағат 11: 00-де, 2011-06-20 22:42
@ 8 жауап

Түрлердің генераторлық түрін пайдалануға болады:

 >>> import types >>> types.GeneratorType <class 'generator'> >>> gen = (i for i in range(10)) >>> isinstance(gen, types.GeneratorType) True 
170
20 июня '11 в 22:46 2011-06-20 22:46 жауап 20 маусымда сағат 22: 46-да берілді. 2011-06-20 22:46

Сіз генераторлық функцияларды білдіресіз бе? inspect.isgeneratorfunction пайдалану.

EDIT:

border=0

егер сіз генератордың объектісін жасағыңыз келсе, JAB-тің ескертулерінде көрсетілгендей, inspect.isgenerator пайдалануыңызға болады.

30
20 июня '11 в 22:44 2011-06-20 22:44 жауап 20 маусымда сағат 22: 22-де муаидта берілді 2011-06-20 22:44

Мен генератордың функциялары мен генераторлары арасындағы айырмашылықты маңызды деп есептеймін (генераторлық функцияның нәтижесі):

 >>> def generator_function(): ... yield 1 ... yield 2 ... >>> import inspect >>> inspect.isgeneratorfunction(generator_function) True 

Calling generator_function қалыпты нәтиже бермейді, тіпті функцияның өзінде ешқандай кодты орындамайды, нәтиже генератор деп аталатын арнайы нысан болады:

 >>> generator = generator_function() >>> generator <generator object generator_function at 0x10b3f2b90> 

сондықтан бұл генератор функциясы емес, генератор:

 >>> inspect.isgeneratorfunction(generator) False >>> import types >>> isinstance(generator, types.GeneratorType) True 

генератор функциясы генератор емес:

 >>> isinstance(generator_function, types.GeneratorType) False 

тек қана сілтеме жасау үшін, генераторды пайдаланған кезде нақты функцияның теледидар қоңырауы пайда болады, мысалы:

 >>> list(generator) [1, 2] 

Сонымен қатар , Python-да функцияның қоңырау шалмас бұрын «генератор» екенін тексеруге болады ма?

14
03 сент. Жауап беру Robert Lujo 03 Sep. 2015-09-03 19:17 '15 at 7:17 pm 2015-09-03 19:17

Тек таза генераторларды (яғни, «генератор» класының объектілерін) тексергіңіз келсе, inspect.isgenerator функциясы жақсы. Дегенмен, егер сіз izip , ол izip қайтарады. Генераторды тексерудің баламалы жолы - бұл функцияны пайдалану:

 def isgenerator(iterable): return hasattr(iterable,'__iter__') and not hasattr(iterable,'__len__') 
11
18 мая '12 в 0:52 2012-05-18 00:52 18-мамырда, 12-де Лука Сбарделла жауап берді. 0:52 2012-05-18 00:52

Мен генератор болып табылатын нысанның келесі әдіс бар-жоғын тексере алатынымды білемін, бірақ мен генераторларға емес, кез-келген нысанның түрін анықтауға тырысамын.

Мұны жасамаңыз. Бұл өте нашар идея.

Оның орнына келесіні орындаңыз:

 try: # Attempt to see if you have an iterable object. for i in some_thing_which_may_be_a_generator: # The real work on `i` except TypeError: # some_thing_which_may_be_a_generator isn't actually a generator # do something else 

TypeError корпусында TypeError s бар екіталай жағдайда бірнеше нұсқалар бар: (1) қателер мөлшерін шектеу үшін функцияны анықтаңыз немесе (2) кірістірілген әрекетті блокты пайдаланыңыз.

Немесе (3) айналасында жүзіп жүрген барлық TypeError ді ажырата білетін нәрсе.

 try: # Attempt to see if you have an iterable object. # In the case of a generator or iterator iter simply # returns the value it was passed. iterator = iter(some_thing_which_may_be_a_generator) except TypeError: # some_thing_which_may_be_a_generator isn't actually a generator # do something else else: for i in iterator: # the real work on `i` 

Немесе (4) тиісті түрде генераторларды қамтамасыз ету үшін сіздің қосымшаңыздың басқа бөліктерін бекітіңіз. Бұл жиі-жиі қарапайым.

2
20 июня '11 в 23:04 2011-06-20 23:04 жауапты С.Лотт 20 маусымда сағат 23: 23-де 2011-06-20 23:04
 >>> import inspect >>> >>> def foo(): ... yield 'foo' ... >>> print inspect.isgeneratorfunction(foo) True 
2
20 июня '11 в 23:14 2011-06-20 23:14 жауап Corey Goldberg 20 маусым '23 сағат 23:14 2011-06-20 23:14

Торнадо веб-серверін немесе ұқсастығын пайдалансаңыз, сервер әдістерінің әдістер емес, іс жүзінде генераторлар екендігін білуіңіз мүмкін. Бұл басқа әдістерге қоңырау шалуды қиындатады, себебі шығыс әдіс ішінде жұмыс істемейді, сондықтан сізге тиісті генераторлық нысандардың бассейндерін басқаруды бастау керек. Шынжырлы генераторлардың бассейндерін басқарудың қарапайым әдісі, мысалы, қосалқы функцияны жасау болып табылады

 def chainPool(*arg): for f in arg: if(hasattr(f,"__iter__")): for e in f: yield e else: yield f 

Енді біз тізбекті генераторларды жазып аламыз

 [x for x in chainPool(chainPool(1,2),3,4,chainPool(5,chainPool(6)))] 

Шығарылымды шығарады

 [1, 2, 3, 4, 5, 6] 

Мүмкін сіз генераторларды ағынға немесе ұқсастыққа балама ретінде пайдалану керек болса, бұл сізге қажет.

1
14 сент. жауап user6830669 берген 14 қыркүйек 2016-09-14 14:31 '16 сағат 20: 30-да 2016-09-14 14:31

Бұл тест жұмыс істейтін сияқты, кем дегенде, мен мына мысал үшін:

str(type(object))=="<class 'generator'>"

0
16 янв. жауап Ильяс Хасл 16 қаңтар. 2019-01-16 00:54 '19 at 0:54 2019-01-16 00:54

туралы сұрақтар немесе Сұрақ қою