객체가 함수 유형인지 Python에서 확인하는 일반적인 방법이 있습니까?
문제
dir(obj)에서 반환된 속성을 반복하는 Python 함수가 있는데, 그 안에 포함된 개체 중 함수, 메서드, 내장 함수 등이 있는지 확인하고 싶습니다.일반적으로 이를 위해 callable()을 사용할 수 있지만 클래스를 포함하고 싶지 않습니다.지금까지 내가 생각해낸 최고는 다음과 같습니다.
isinstance(obj, (types.BuiltinFunctionType, types.FunctionType, types.MethodType))
이 확인을 수행하는 더 미래 보장적인 방법이 있습니까?
편집하다: 제가 전에 다음과 같이 말했을 때 잘못 말한 적이 있습니다."일반적으로이를 위해 Callable ()을 사용할 수는 있지만 수업을 실격시키고 싶지는 않습니다." 나는 실제로 하다 수업을 취소하고 싶습니다.나는 일치하고 싶다 오직 클래스가 아닌 함수.
해결책
검사 모듈에는 정확히 원하는 것이 있습니다:
inspect.isroutine( obj )
참고로 코드는 다음과 같습니다.
def isroutine(object):
"""Return true if the object is any kind of function or method."""
return (isbuiltin(object)
or isfunction(object)
or ismethod(object)
or ismethoddescriptor(object))
다른 팁
클래스 및 기타 임의 개체를 제외하려는 경우 __call__
메서드를 검색하고 함수와 메서드만 확인합니다. 이 세 가지 함수는 inspect
기준 치수
inspect.isfunction(obj)
inspect.isbuiltin(obj)
inspect.ismethod(obj)
미래에 대비한 방식으로 원하는 일을 해야 합니다.
if hasattr(obj, '__call__'): pass
이것은 또한 Python의 "오리 타이핑" 철학과 더 잘 들어맞습니다. 왜냐하면 여러분은 별로 신경 쓰지 않기 때문입니다. 무엇 당신이 그것을 부를 수 있는 한 그것은 그렇습니다.
주목할 만한 점은 callable()
Python에서 제거되고 있으며 3.0에는 없습니다.
'클래스'의 의미에 따라 다음과 같습니다.
callable( obj ) and not inspect.isclass( obj )
또는:
callable( obj ) and not isinstance( obj, types.ClassType )
예를 들어 'dict'에 대한 결과는 다릅니다.
>>> callable( dict ) and not inspect.isclass( dict )
False
>>> callable( dict ) and not isinstance( dict, types.ClassType )
True
제휴하지 않습니다 StackOverflow