반응형
질문
나는 변수 x
가 함수를 가리키는지 여부를 알고 싶습니다.
나는 다음과 같은 작업을 할 수 있기를 희망했습니다:
>>> isinstance(x, function)
하지만 그것은 다음을 제공합니다:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'function' is not defined
그것을 선택한 이유는 다음과 같습니다.
>>> type(x)
<type 'function'>
답변
만약 이것이 Python 2.x 또는 Python 3.2+를 위한 것이라면, callable()
을 사용할 수 있습니다. 이전에는 사용이 중단되었지만, 지금은 중단이 해제되어 다시 사용할 수 있습니다. 이에 대한 토론은 여기에서 읽을 수 있습니다: http://bugs.python.org/issue10518. 다음과 같이 할 수 있습니다:
callable(obj)
만약 이것이 Python 3.x이지만 3.2 이전 버전이라면, 객체가 __call__
속성을 가지고 있는지 확인하세요. 다음과 같이 할 수 있습니다:
hasattr(obj, '__call__')
자주 제안되는 types.FunctionTypes
또는 inspect.isfunction
접근 방식(둘 다 정확히 같은 일을 합니다)은 여러 가지 주의사항이 있습니다. 비-Python 함수에 대해서는 False
를 반환합니다. 대부분의 내장 함수는 C로 구현되어 있으므로 Python이 아니므로 False
를 반환합니다:
>>> isinstance(open, types.FunctionType)
False
>>> callable(open)
True
따라서 types.FunctionType
은 예상치 못한 결과를 반환할 수 있습니다. 덕 타이핑된 객체의 속성을 확인하는 올바른 방법은 그것들이 꽥꽥 소리를 내는지 묻는 것입니다. 오리 크기의 컨테이너에 맞는지 확인하는 것이 아닙니다.
반응형
댓글