为啥要将一个类作为 lambda 传递?

Posted

技术标签:

【中文标题】为啥要将一个类作为 lambda 传递?【英文标题】:Why would you pass a class as a lambda?为什么要将一个类作为 lambda 传递? 【发布时间】:2019-05-08 05:31:14 【问题描述】:

我根据在线示例和教程构建了我的第一个 GraphQL API,但想知道为什么某些事情是用 Python 完成的。

一个我不明白的类的sn-p:

class UpdateRegion(graphene.Mutation):
    """Update a region."""
    region = graphene.Field(lambda: Region, description="Region updated by this mutation.")
...

区域类:

class Region(SQLAlchemyObjectType):
   class Meta:
       model = RegionModel
       interfaces = (relay.Node, )

为什么他们将 Region 类作为 lambda 函数传递? 对我来说lambda: Regionf():return Region 是一样的

【问题讨论】:

因为lambda的定义比类似的函数定义要短 如果 Field 参数的定义是它应该是 a Callable 专门返回一个对象/构造函数/其他东西,这是一种自然的方法它。 我怎样才能轻松发现它必须是可调用的?因为文档不清楚 嗯,文档应该更清楚了。如果不是,您可以尝试深入研究代码本身。 注意:直接使用Field构造函数时,传递的是类型而不是实例。安装在字段中的类型充当参数。这是他们在文档中给出的唯一提示 【参考方案1】:

对我来说lambda: Regionf():return Region 相同

对于初学者来说,f():return Region 不是有效的语法。当然,这可以修复:

def f():
  return Region

region = graphene.Field(f, ...)

这将起作用并且大致相当于region = graphene.Field(lambda: Region, ...)。后者更短,可以说更清晰。

【讨论】:

传递Field(lambda: Region)Field(Region) 有何不同? @GPhilo 更深一层。必须调用 lambda 对象 lambda: Region 以获取 Region,然后再次获取 Region 实例。 OTOH,Region 本身只能调用一次才能获得 Region 实例。 我明白了!谢谢,我错过了那个细节

以上是关于为啥要将一个类作为 lambda 传递?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 lambda auto& 参数选择 const 重载?

从匿名方法到 Lambda 表达式的推演过程

Java 8 Lambda 表达式

使用 Lambda 传递和转换 Comparator 作为方法的参数

为啥 lambda 参数在 C++11 中以只读方式传递?

java8新特性总结