2016-08-08 3 views
-2

일부 유형을 참조하는 방법을 알고 있습니다. 즉 type('')의 경우 str이고 의 경우 int 등입니다.하지만 type(lambda: None)과 같은 다른 유형은 무엇입니까?Python에서 유형을 참조하는 방법은 무엇입니까?

저는 이것을 비교하기 위해 type(f) == type(lambda: None)으로 언급하는 것으로 알고 있지만, 다른 방법이 있습니까? (코드 골프와 같은 어리석은 대답이 아니며 람다의 반환 값을 사용하십시오.)

편집 : 나는 수락 된 답변을 어떻게 활용했는지를 알아 냈습니다!

import types 

function     = types.FunctionType 
builtin_function_or_method = types.BuiltinFunctionType 
classobj     = types.ClassType 
generator     = types.GeneratorType 
object      = type 

del types 
+2

정확히 어떤 목적으로? 특정 변수에 * lambda *가 있는지 테스트하고 싶습니까? 뭔가가 있다면 테스트를 위해 보통 isinstance를 사용합니다 *. – deceze

+0

'import types' 다음에'types.FunctionType' – muddyfish

+0

"문서에 가장 적합한 답변을 추가하십시오." 왜? – Evert

답변

2

당신이 특정 값이 람다경우 테스트하려면 :

import types 

foo = lambda: None 
print(isinstance(foo, types.LambdaType)) 

https://docs.python.org/3/library/types.html를 참조하십시오.

, type() == type()에 매우 싫은 것이 있으면 에 일반적으로 isinstance을 사용합니다.

+0

왜 * lambda *가 아닌 * function *입니까? –

+0

그것이 명시 적으로 테스트하고 싶은 것이기 때문에 ...!? 'types.FunctionType'에 대해서도 테스트 할 수 있습니다. type.FunctionType은 원하는 경우 lambda를 포함합니다. – deceze

+0

그러나'type (lambda : None)'은 함수로, 특별히 람다가 아닙니다. 'types.LambdaType'은 "표준"AFAIK가 아닙니다. –

1

파이썬 2에서 다양한 내장 유형의 유형을 얻으려면 types 모듈을 사용할 수 있습니다.

import types 
l = lambda: 0 
function_type = types.FunctionType 
if isinstance(l, function_type): 
    do_stuff() 
1

어떤 것이 기능인지 확인하는 것은 호출 가능한지 확인하는 것과 다릅니다. 대개 개체가 호출 가능한지 확인하고 싶습니다 (이 개체를 함수처럼 사용할 수 있습니까?).

함수는 몇 가지 유형의 호출 가능 함수 중 하나입니다.

  1. 순수 파이썬 함수
  2. 방법
  3. 클래스/__call__ 방법과 인스턴스
  4. 기본 제공된 (C) 순수 파이썬 함수 중 하나 lambda되는 것이다

함수 : 그들이있다 또는 def 문을 사용하여 정의 할 수 있습니다. 메서드는 클래스에 존재하며 인스턴스를 통해 액세스 한 함수입니다. 기본적으로 인스턴스로 바인딩 된 첫 번째 인수가있는 함수입니다. 클래스 및 객체는 클래스가 __call__ 메소드를 구현할 경우 호출 할 수 있습니다 (모든 클래스는 기본적으로 호출 가능하지만 모든 객체는 호출 할 수 없음). 내장 함수는 Python이 아닌 C로 작성된 함수입니다.

무언가가 호출 가능한지 확인하려면 callable 기능을 사용하십시오. 예.

>>> callable(lambda: None) 
True 
>>> class X: 
    def f(self): 
     pass 

>>> callable(X().f) 
True 
>>> callable(object) 
True 
>>> callable(len) 
True 

당신이 객체가 다음 types 모듈을 사용하여 호출의 특정 부속 유형 중 하나인지 확인하십시오.

>>> from types import FunctionType, BuiltinFunctionType, MethodType 
>>> isinstance((lambda: None), FunctionType) 
True 
>>> class X: 
    def f(self): 
     pass 

>>> isinstance(X().f, FunctionType) 
False 
>>> isinstance(X.f, FunctionType) # False in Python 2.x 
True 
>>> isinstance(object, FunctionType) 
False 
>>> isinstance(len, FunctionType) 
False 

다른 유형의 경우 collections.abc 모듈을 사용할 수 있습니다. 여기에 정의 된 클래스는 서브 클래스의 인스턴스를 스펙으로 확인하는 추상 기본 클래스이거나 오브젝트가 해당 유형의 인스턴스로 작동 할 수 있는지 확인하는 데 사용될 수 있습니다. 예.

from collections.abc import Generator 
def my_generator(): 
    yield 
assert isinstance(my_generator(), Generator) 
assert type(my_generator()) is not Generator 
+0

내가 호출 할 수있는 * 유형 *이 아닌 * 확인하고 싶습니다. 함수, 내장 메소드 및 클래스는 모두 호출 가능합니다. 하지만 코드로 함수를 사용하려면 어떻게해야합니까? 코드를 저장하기 위해 .__ init__ 클래스를 사용합니까? 함수와 내장 함수가 여기서 일을합니다. 클래스에서 메소드는 또한 작업을 수행합니다 (클래스에있는 함수의 다른 이름 일뿐입니다.) –

+0

요점은, 함수와 다른 호출 가능 함수. 올바른 주장을 취하고 올바른 결과를 반환하는 한 중요하지 않습니다. 이것이'callable'이 바람직한 이유입니다. 둘째, 방법 **은 ** 다른 기능입니다. 메서드는 단순히 첫 번째 인수가 이미 채워져있는 함수입니다. 'str.count ('abda', 'a') '와'abra '.count ('a')를 비교하십시오. 메소드의 유형을 보려면'type (MyClass(). func)'을 시도하십시오. 메소드는 나중에'self' 인자를 제공 할 필요없이 저장되고 호출 될 수 있습니다. 예. 'caps = 'abra'.capitalize; asserts caps() == 'ABRA'. – Dunes

+0

하지만 호출 할 수있는 것이 아니라 * 유형 *을 알고 싶습니다 ... –

관련 문제