【问题标题】:How can I test whether a variable holds a lambda?如何测试变量是否包含 lambda?
【发布时间】:2011-04-09 00:33:22
【问题描述】:

有没有办法测试变量是否包含lambda? 上下文是我想在单元测试中检查一个类型:

self.assertEquals(lambda, type(myVar))

type 似乎是“函数”,但我没有看到任何明显的内置类型来匹配它。 显然,我可以写这个,但感觉很笨拙:

self.assertEquals(type(lambda m: m), type(myVar))

【问题讨论】:

  • 不要将问题设置为“社区 wiki”。
  • 我通常不会发布“wiki”问题的答案(太让人头疼了),但简短的回答是:不要。 Lambda 不是 Python 中的类型,它只是声明函数的简写。试图区分它们是没有意义的;没有区别。

标签: python class types lambda


【解决方案1】:

这是逾期数年,但callable(mylambda) 将为任何可调用函数或方法返回True,包括 lambda。 hasattr(mylambda, '__call__') 做同样的事情,但不那么优雅。

如果您需要知道某事物是否完全是一个 lambda,那么我会使用:

callable(mylambda) and mylambda.__name__ == "<lambda>"

(此答案与 Python2.7.5 及更高版本相关。)

【讨论】:

  • 对于它的价值,我建议将 hasattr(mylambda, '__call__') 引用更改为 callable(mylambda) - 它在引擎盖下做同样的事情,但它是 Python 2 的内置功能,已记录docs.python.org/2/library/functions.html#callable.
  • 我什至不知道这件事——我并不惊讶有这样的事情,但我有点困惑,因为几个月前我在查找它时没有找到它... 酷。
  • 这是最好的答案,恕我直言
【解决方案2】:
def isalambda(v):
  LAMBDA = lambda:0
  return isinstance(v, type(LAMBDA)) and v.__name__ == LAMBDA.__name__

【讨论】:

  • 谢谢,我会去的。仅仅像我一样测试类型并不理想,因为任何函数都会匹配,因此检查 name 或 func_name 是一个很好的组合。不知道内部 lambda 名称稍后更改的可能性有多大。它仍然很笨拙:-)
  • @ralfoids,同意笨拙,但是 Python lambdas 一路上完全笨拙;-) 顺便说一句,无论是 var 对你有什么影响到底是def'd 函数还是lambda
  • @ralfoide,如果您担心lambda 的名称发生变化,可以使用v.__name__== (lambda: None).__name__
  • @Alex 和@glenn 上面:有趣的是我最终编写了我的测试来检查它是否是一个函数,并且确实决定不关心它是一个 lambda 还是一个函数。看到它可以进行测试仍然很有趣,我喜欢@gnibbler 的想法不依赖于常数。
  • @gnibbler:原则上,Python 实现可以为 lambdas 赋予唯一的名称,例如。基于 co_filename/co_firstlineno,或使用也是有效函数名称的占位符名称(例如,简单的“lambda”)。也许不理想,但有效——最好避免花招。
【解决方案3】:

使用typesmodule

from types import *

assert isinstance(lambda m: m, LambdaType)

根据文档,使用from types import * 是安全的。

读者注意:这是错误的! types.LambdaType is types.FunctionType,所以上面的表达式将匹配 Lambda 和函数,等等。

【讨论】:

  • 与接受的答案相反,如果更改了 lambda 函数的 __name__,这也有效。
  • 这是错误的:types.LambdaType types.FunctionType。这意味着这将匹配 Lambda 和类似的函数
  • 由于没有实际区别,这可能是最好的答案。
  • 在 Python 2.7 中也可以使用 from types import LambdaType 而不是 from types import *
  • 不要使用它来欺骗你!请参阅 polvoazul 的评论 3。
【解决方案4】:

无需进行任何黑客攻击,内置的inspect 模块会为您处理。

import inspect
print inspect.isfunction(lambda x:x)

【讨论】:

  • 您的建议有callable,此外,这不是OP所要求的。
【解决方案5】:
mylambda.func_name == '<lambda>'

【讨论】:

  • 是的,这不是由语言指定的,它可能随时中断。不要这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多