0

我在GAE中創建了一堆Foo對象。在Google App Engine Datastore中存儲lambda函數(python 2.7)

我希望每個Foo都有一個名爲fooify()的函數。 調用fooify(對象)應該返回對象,但以某種方式進行轉換。

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

  • [1,2](fooify =拉姆達X:[N-1爲在X N])
  • [2 ,3](fooify =拉姆達X:X)
  • [2,4](fooify =拉姆達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函數寫成字符串,(煩人 - 沒有語法高亮等)

Is還有另一種解決方法,我錯過了?

+0

我沒有看到很多選擇,你不能pickle一個lambda這些lambda defintions來自哪裏如果他們將在在某處存儲代碼然後只存儲一個名字並查找它。如果它來自fr om webrequest /用戶輸入,你將不得不做一些像eval一樣的創建它。 –

+0

當我構建大量Foos(100s)時,它最初來自代碼,但我也希望能夠通過某種管理界面來運行新的Foos。我想eval可能是這樣做的方式... –

回答

2

使用polymodel可能適合您的需要,如果您的不同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

相關問題