我知道如何引用某些类型,例如str
为type('')
,int
为type(1)
等等。但是其他类型如何,例如{{1} }?
我知道将其称为type(lambda: None)
进行比较,但除此之外还有其他方法吗? (没有愚蠢的答案,比如代码高尔夫,使用lambda的另一个返回值等)。
编辑:我刚刚知道如何利用已接受的答案!
type(f) == type(lambda: None)
答案 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)
检查某个函数是否与函数不同,检查它是否可调用。 您很可能想要检查对象是否可调用(我可以像函数一样使用此对象吗?)。
函数是几种可调用类型之一。他们是:
__call__
方法的类/实例纯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