在 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(...)
。但是,它会跟踪类层次结构,因此当您加载实体时知道它是 MyFirstFoo
与 MySecondFoo
。
【讨论】:
以上是关于在 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