파이썬에서 객체가 생성기 객체인지 확인하는 방법은 무엇입니까? in <module> NameError:

파이썬에서 객체가 생성기 객체인지 어떻게 확인합니까?

이것을 시도-

>>> 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예를 들어 izipiterable 을 확인 하면 반환 됩니다 . 일반화 된 발전기를 확인하는 다른 방법은이 기능을 사용하는 것입니다.

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 루프 의 본문에 TypeErrors가 있으면 (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) 응용 프로그램의 다른 부분을 수정하여 생성기를 적절하게 제공하십시오. 종종이 모든 것보다 간단합니다.