在googleappengine数据存储中存储lambda函数(python2.7)

2024-09-27 21:28:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

  • [1,2](fooify=lambda x:[n-1代表x中的n])
  • [2,3](食物=λx:x)
  • [2,4](食品=λx:[x[0],x[1]+1])

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

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

Foo类看起来像:

^{pr2}$

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

^{3}$

它使用eval()创建fooify函数的主要部分。我不想使用eval(),因为它看起来有点像黑客,而且这也意味着我必须将所有的fooify\u str函数都写成字符串(恼人-没有语法高亮显示等)

有没有别的办法让我错过?在


Tags: 对象lambda函数食品定义objectfooeval
1条回答
网友
1楼 · 发布于 2024-09-27 21:28:21

如果不同的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与{}。在

相关问题 更多 >

    热门问题