如何在Python中引用类型?

时间:2016-08-08 10:25:25

标签: python types

我知道如何引用某些类型,例如strtype('')inttype(1)等等。但是其他类型如何,例如{{1} }?

我知道将其称为type(lambda: None)进行比较,但除此之外还有其他方法吗? (没有愚蠢的答案,比如代码高尔夫,使用lambda的另一个返回值等)。

编辑:我刚刚知道如何利用已接受的答案!

type(f) == type(lambda: None)

3 个答案:

答案 0 :(得分:2)

如果您想测试某个值是否为 lambda

import types

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

请参阅https://docs.python.org/3/library/types.html

您通常使用isinstance来测试,如果某事type() == type()非常不满意。

答案 1 :(得分:1)

要在Python 2中获取各种内置类型的类型,可以使用types模块。

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

答案 2 :(得分:1)

检查某个函数是否与函数不同,检查它是否可调用。 您很可能想要检查对象是否可调用(我可以像函数一样使用此对象吗?)。

函数是几种可调用类型之一。他们是:

  1. 纯python函数
  2. 方法
  3. 使用__call__方法的类/实例
  4. 内置(C)功能
  5. 纯python函数是lambda或使用def语句定义的函数。方法是一个存在于类中的函数,并且已经通过实例访问 - 基本上是一个函数,它的第一个参数被绑定为一个实例)。如果类和对象实现了__call__方法,则可以调用它们(所有类在默认情况下都是可调用的,但并非所有对象都是可调用的)。内置函数只是用C语言编写的函数,而不是Python。

    如果要检查某些内容是否可调用,请使用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