我在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(...)
.但是,它会跟踪类层次结构,因此当您加载实体时,它知道它是MyFirstFoo
与MySecondFoo
。