在 Google App Engine Datastore (python 2.7) 中存储 lambda 函数

Posted

技术标签:

【中文标题】在 Google App Engine Datastore (python 2.7) 中存储 lambda 函数【英文标题】:Storing a lambda function in the Google App Engine Datastore (python 2.7) 【发布时间】:2015-06-19 02:40:40 【问题描述】:

我正在 GAE 中创建一堆 Foo 对象。

我希望每个 Foo 都有一个名为 fooify() 的函数。 调用 fooify(object) 应该返回对象,但会以某种方式进行转换。

例如,fooify([2,3]) 可能会返回:

[1,2] (fooify = lambda x: [n-1 for n in x]) [2,3] (fooify = lambda x: x) [2,4] (fooify = lambda x: [x[0],x[1]+1])

我希望能够在创建对象时定义 fooify 所做的事情,最好使用以下内容:

foo1=Foo()
foo1.fooify=lambda x: [n^2 for n in x]
foo1.put()

Foo 类看起来像:

from google.appengine.ext import ndb
class Foo(ndb.Model):
    name=ndb.StringProperty(default="generic foo", indexed=True)
    fooify=ndb.SOMETHINGProperty(indexed=False)    # This contains the function

我知道这不是数据存储的用途,但仍想这样做。 目前我能看到的唯一选项如下:

class Foo(ndb.Model):
    name=ndb.StringProperty(default="generic foo", indexed=True)
    fooify_str=ndb.StringProperty(indexed=False)    # Contains something like "lambda x: [n+3 for n in x]"

    def fooify(self,obj):
        func = eval(self.fooify_str)
        return func(obj)

它使用 eval() 来创建 fooify 函数的主要部分。我不想使用 eval() 因为它看起来有点 hack-ish,这也意味着我必须将所有 fooify_str 函数写成字符串,(烦人 - 没有语法突出显示等)

还有其他我想念的方法吗?

【问题讨论】:

我没有看到很多替代方案。你不能腌制一个 lambda。这些 lambda 定义来自哪里。如果他们要在某个地方的代码中,那么只需存储一个名称并查找它。如果它来自网络请求/用户输入,您必须首先执行 eval 之类的操作来创建它。 它最初来自代码,当我构建大量 Foos (100s) 时,但我也希望能够通过某种管理界面运行新的 Foos。我想 eval 可能是这样做的方法...... 【参考方案1】:

如果您的不同fooify 函数在某种程度上组织在类层次结构中,则使用polymodel 可能会满足您的需求。

你可以定义你的模型:

class Foo(polymodel.PolyModel):
  name = ndb.StringProperty()

class MyFirstFoo(Foo):
  def fooify(self, obj):
    ...

class MySecondFoo(Foo):
  def fooify(self, obj):
    ...

ndb 会将这些全部存储在 Foo 类别下,因此对 Foo 的任何查询都将返回所有结果(即 Foo.query().filter(...)。但是,它会跟踪类层次结构,因此当您加载实体时知道它是 MyFirstFooMySecondFoo

【讨论】:

以上是关于在 Google App Engine Datastore (python 2.7) 中存储 lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Cloud App Engine 上使用 PubSub 创建订阅者,该订阅者通过 Publisher 从 Google Cloud App Engine Flex 收听消息?

Google Cloud 中的 Google Compute Engine、App Engine 和 Container Engine 有啥区别?

Google-App-Engine 上的 Grails - 它死了吗? [关闭]

在 Google App Engine 上部署 create-react-app

Google App Engine Flexible 和 Google Container Engine 之间的区别?

如何在 Google App Engine app.yaml 中处理尾部斜线