【问题标题】:How to check that variable is a lambda function如何检查该变量是 lambda 函数
【发布时间】:2014-05-25 05:45:13
【问题描述】:

我正在开发一个项目,其中包含多个模块。简化问题,有一些变量 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
>>> 

【问题讨论】:

标签: python types lambda


【解决方案1】:

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

x = lambda d:d*d
import types
print type(x) is types.LambdaType
# True
print isinstance(x, types.LambdaType)
# True

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

x = lambda x: None
def y(): pass
print y.__name__
# y
print x.__name__
# <lambda>

所以,我们像这样将这两项检查放在一起

def is_lambda_function(obj):
    return isinstance(obj, types.LambdaType) and obj.__name__ == "<lambda>"

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

【讨论】:

  • isinstance(x, types.LambdaType) 看起来更地道。
  • 值得注意的是types.LambdaTypetypes.FunctionType的别名。没有(简单或可靠的)方法可以区分 lambda 函数和使用 def 创建的函数。
  • @Blckknght 这就是为什么我们还需要检查__name__ :-)
  • 所以应该是步骤过程类型(x)是 types.LambdaType 和 x.__name__ == ''。对吗?
  • 啊,我发现我没有对答案的结尾给予足够的关注,而且您已经解决了 lambdas 与常规函数的问题。我建议虽然可能没有太多需要区分。如果您的代码真的关心给定函数的定义方式,那么您可能做错了。大多数时候你应该使用“duck typing”而不是严格的类型检查。如果您期望一个函数,请接受任何可调用的内容(例如类或具有__call__ 方法的类的实例)。如果您确实需要预先检查,请使用内置的callable 函数。
【解决方案2】:

如果您更喜欢typing 模块,请使用Callable

In [1]: from typing import Callable
In [2]: isinstance(lambda: None, Callable)
Out[2]: True

【讨论】:

  • 你的解决方案和@Blckknght 建议使用callable 内置函数有什么区别?
  • @rth 你不能使用callable() 输入提示你的签名
  • 常规函数(不是 lambda)也返回 True:def x(): passisinstance(x, Callable) ->True。因此,我认为您的答案与@thefourtheye 相比没有任何优势。
  • 1) 您的问题应该指定您想要区分 lambda 函数和普通函数(如果这是必需的)。 2)callable(lambda: None) == True
  • 我不知道如何更具体,它在标题中 如何检查该变量是 lambda 函数 :) 谢谢您的额外回答!跨度>
猜你喜欢
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多