如何检查该变量是一个lambda函数

rth*_*rth 9 python lambda types

我正在开发一个包含几个模块的项目.简化问题,有一些变量x.有时它可能是int或float或list.但它可能是一个lambda函数,应该以不同的方式处理.如何检查变量x是否为lambda?

例如

>>> x = 3
>>> type(x)
<type 'int'>
>>> type(x) is int
True
>>> x = 3.4
>>> type(x)
<type 'float'>
>>> type(x) is float
True
>>> x = lambda d:d*d
>>> type(x)
<type 'function'>
>>> type(x) is lambda
  File "<stdin>", line 1
    type(x) is lambda
                    ^
SyntaxError: invalid syntax
>>> type(x) is function
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'function' is not defined
>>> 
Run Code Online (Sandbox Code Playgroud)

the*_*eye 19

您需要使用types.LambdaTypetypes.FunctionType确保该对象是这样的函数对象

x = lambda d:d*d
import types
print type(x) is types.LambdaType
# True
print isinstance(x, types.LambdaType)
# True
Run Code Online (Sandbox Code Playgroud)

然后你需要检查名称以确保我们正在处理lambda函数,就像这样

x = lambda x: None
def y(): pass
print y.__name__
# y
print x.__name__
# <lambda>
Run Code Online (Sandbox Code Playgroud)

所以,我们将这两个检查放在一起

def is_lambda_function(obj):
    return isinstance(obj, types.LambdaType) and obj.__name__ == "<lambda>"
Run Code Online (Sandbox Code Playgroud)

正如@Blckknght建议的那样,如果你想检查对象是否只是一个可调用的对象,那么你可以使用内置callable函数.

  • 值得注意的是,"types.LambdaType"是`types.FunctionType`的别名.没有(简单或可靠)方法来区分lambda函数和使用`def`创建的函数. (7认同)
  • `isinstance(x,types.LambdaType)`看起来更像惯用语. (2认同)
  • @Blckknght这就是为什么我们还需要检查`__name__`的原因:-) (2认同)
  • 啊,我看到我没有对答案的结尾给予足够的重视,你已经解决了lambdas与常规函数的问题.我建议尽管可能没有太多需要区分它们.如果您的代码真的关心如何定义给定的函数,那么您可能做错了.大多数时候你应该使用"鸭子打字"而不是严格的类型检查.如果你期望一个函数,接受任何可调用的东西(比如一个类,或一个带有`__call__`方法的类的实例).如果您确实需要预先检查,请使用内置的`callable`函数. (2认同)