如果我声明两个函数a
和b
:
def a(x):
return x**2
b = lambda x: x**2
我不能用type
来区分它们,因为它们是同一类型的。你知道吗
assert type(a) == type(b)
另外,types.LambdaType
也没有帮助:
>>> import types
>>> isinstance(a, types.LambdaType)
True
>>> isinstance(b, types.LambdaType)
True
我们可以使用__name__
,比如:
def is_lambda_function(function):
return function.__name__ == "<lambda>"
>>> is_lambda_function(a)
False
>>> is_lambda_function(b)
True
但是,由于__name__
可能已被修改,因此is_lambda_function
不能保证返回正确的结果:
>>> a.__name__ = '<lambda>'
>>> is_lambda_function(a)
True
有没有比__name__
属性更可靠的方法?你知道吗
我趁机潜入cpython's source看看能不能找到什么,恐怕我不得不附和Serge's answer:你不能。你知道吗
简而言之,这是一个lambda在解释器中的旅程:
expr_ty
转换为适当的类型(在本例中是Lambda)从这一点上,我看不出任何特定于lambdas的东西。这一点,再加上Python允许您修改对象的几乎所有属性的事实,让我/我们相信您想要做的是不可能的。你知道吗
好吧,在python3中你不可能可靠。你知道吗
python2用来定义一系列函数类型。因此,方法、lambda和普通函数都有各自的类型。你知道吗
python3只有一种类型
function
。使用def
和lambda
声明正则函数确实有不同的副作用:def
将名称设置为函数的名称(和限定名),并可以设置docstring,而lambda
将名称(和限定名)设置为<lambda>
,并将docstring设置为None。但这是可以改变的。。。你知道吗如果函数是从常规Python源代码加载的(而不是在交互环境中键入的),则
inspect
模块允许访问原始Python代码:这将打印:
顺便说一句,如果问题是函数的序列化,则可以成功地对声明为lambda的函数进行pickle,前提是您为其提供唯一的限定名:
相关问题 更多 >
编程相关推荐