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



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

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

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

  • [1,2] (fooify = lambda x: [n-1 表示 x 中的 n])
  • [2,3] (fooify = λ 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(),因为它看起来有点黑客式的,这也意味着我必须将所有fooify_str函数写为字符串,(烦人 - 没有语法突出显示等)

我缺少的还有另一种解决方法吗?

如果您的不同fooify函数在某种程度上组织在类层次结构中,则使用多模型可能适合您的需求。

您可以定义模型:

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

最新更新