오브젝트가 python에서 generator 오브젝트인지 확인하는 방법
python에서는 객체가 생성 객체인지 어떤지를 어떻게 확인할 수 있습니까?
시험 중 -
>>> type(myobject, generator)
에러가 표시됩니다.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'generator' is not defined
(오브젝트에 다음이 있는지 확인할 수 있습니다.next
생성기가 되는 방법은 있지만 생성기뿐만 아니라 개체 유형을 결정할 수 있는 방법이 필요합니다.)
제너레이터 사용 가능유형에서 유형:
>>> import types
>>> types.GeneratorType
<class 'generator'>
>>> gen = (i for i in range(10))
>>> isinstance(gen, types.GeneratorType)
True
발전기 기능 말인가요? 사용.
편집:
제너레이터 객체를 원하는 경우 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]
참고 항목 python에서 함수를 호출하기 전에 "제너레이터 함수"인지 확인하는 방법이 있습니까?
그inspect.isgenerator
순수 생성기(즉, 클래스 "class"의 객체)를 확인하려는 경우 함수는 정상입니다.그러나 그것은 돌아올 것이다.False
예를 들어 a를 체크하면izip
반복할 수 있습니다.일반 제너레이터를 점검하는 다른 방법은 다음 기능을 사용하는 것입니다.
def isgenerator(iterable):
return hasattr(iterable,'__iter__') and not hasattr(iterable,'__len__')
반복기, 더 구체적으로 말하면 입력 모듈의 생성기를 사용할 수 있습니다.
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
(오래된 포스트인 것은 알고 있습니다.)모듈을 Import할 필요가 없습니다.프로그램 시작 시 비교할 객체를 선언할 수 있습니다.
gentyp= type(1 for i in "")
...
type(myobject) == gentyp
오브젝트에 제너레이터가 되는 다음 메서드가 있는지 확인할 수 있지만, 제너레이터뿐만 아니라 오브젝트의 종류를 특정할 수 있는 방법이 필요합니다.
이러지마세요.이건 정말 정말 안 좋은 생각이야
대신 다음을 수행합니다.
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) 중첩된 트라이 블록을 사용하는 등 여러 가지 선택사항이 있습니다.
또는 (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) 어플리케이션의 다른 부분을 수정하여 발전기를 적절히 제공할 수 있습니다.이 모든 것보다 더 간단한 경우가 많습니다.
토네이도 웹 서버 등을 사용하는 경우 서버 방식은 실제로는 생성기이며 메서드가 아님을 알 수 있습니다.이로 인해 다른 메서드를 호출하기가 어려워집니다.이는 메서드 내에서 수율이 동작하지 않기 때문에 연결된 제너레이터 객체의 풀 관리를 시작해야 하기 때문입니다.체인 제너레이터 풀을 관리하는 간단한 방법은 다음과 같은 도움말 함수를 만드는 것입니다.
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]
스레드 대체 수단으로 제너레이터를 사용하려는 경우 이 방법을 사용할 수 있습니다.
조금 오래된 질문이지만, 저도 비슷한 솔루션을 찾고 있었습니다만, 비동기 생성기 클래스용이므로 도움이 될 것입니다.
utdemir 응답에 근거합니다.
import types
isinstance(async_generator(), types.AsyncGeneratorType)
언급URL : https://stackoverflow.com/questions/6416538/how-to-check-if-an-object-is-a-generator-object-in-python
'programing' 카테고리의 다른 글
표시 가능한 DOM에 요소가 존재하는지 확인하려면 어떻게 해야 합니까? (0) | 2022.09.11 |
---|---|
컴포넌트를클릭하면클래스를바디에추가하시겠습니까? (0) | 2022.09.11 |
브라우저의 JavaScript에서 SQL Server 데이터베이스에 연결하는 방법 (0) | 2022.09.11 |
PyMySQL이란 무엇이며 MySQLdb와 어떻게 다릅니까? Django 배포에 영향을 줄 수 있습니까? (0) | 2022.09.09 |
c - 경고: 함수의 암묵적 선언 'printf' (0) | 2022.09.09 |