객체가 함수 유형인지 Python에서 확인하는 일반적인 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/74092

  •  09-06-2019
  •  | 
  •  

문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top