파이썬에서 객체가 생성기 객체인지 어떻게 확인합니까?
이것을 시도-
>>> type(myobject, generator)
오류를 준다-
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'generator' is not defined
(객체 next
에 생성자가 될 수 있는 방법 이 있는지 확인할 수는 있지만 생성기뿐만 아니라 모든 객체의 유형을 결정할 수있는 방법을 원합니다.)
답변
다음 유형에서 GeneratorType을 사용할 수 있습니다.
>>> import types
>>> types.GeneratorType
<class 'generator'>
>>> gen = (i for i in range(10))
>>> isinstance(gen, types.GeneratorType)
True
답변
발전기 기능을 의미합니까? 사용하십시오 inspect.isgeneratorfunction
.
편집하다 :
생성기 객체를 원한다면 JAB가 주석에서 지적한 바와 같이 inspect.isgenerator 를 사용할 수 있습니다 .
답변
생성기 함수 와 생성기 (생성기 함수의 결과)를 구별하는 것이 중요하다고 생각합니다 .
>>> def generator_function():
... yield 1
... yield 2
...
>>> import inspect
>>> inspect.isgeneratorfunction(generator_function)
True
generator_function을 호출하면 정상적인 결과를 얻지 못하고 함수 자체에서 코드를 실행하지 않으며 결과는 generator 라는 특수 객체가됩니다 .
>>> 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]
답변
inspect.isgenerator
당신이 순수 발전기 (즉 클래스 “발전기”의 객체)를 확인하려면 기능은 괜찮습니다. 그러나 False
예를 들어 izip
iterable 을 확인 하면 반환 됩니다 . 일반화 된 발전기를 확인하는 다른 방법은이 기능을 사용하는 것입니다.
def isgenerator(iterable):
return hasattr(iterable,'__iter__') and not hasattr(iterable,'__len__')
답변
타이핑 모듈 에서 Iterator 또는보다 구체적으로 Generator를 사용할 수 있습니다 .
from typing import Generator, Iterator
g = (i for i in range(1_000_000))
print(type(g))
print(isinstance(g, Generator))
print(isinstance(g, Iterator))
결과:
<class 'generator'>
True
True
답변
>>> import inspect
>>>
>>> def foo():
... yield 'foo'
...
>>> print inspect.isgeneratorfunction(foo)
True
답변
객체에 생성기가 될 다음 방법이 있는지 확인할 수 있지만 생성기뿐만 아니라 모든 객체의 유형을 결정할 수있는 방법을 원합니다.
이러지 마 그것은 단지 매우, 매우 나쁜 생각입니다.
대신 다음을 수행하십시오.
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
드문 경우지만 for 루프 의 본문에 TypeError
s가 있으면 (1) 오류 범위를 제한하는 함수를 정의하거나 (2) 중첩 된 try 블록을 사용하십시오.
또는 (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) 응용 프로그램의 다른 부분을 수정하여 생성기를 적절하게 제공하십시오. 종종이 모든 것보다 간단합니다.