如何动态确定Google App Engine中是否存在Model类?

时间:2009-04-09 21:28:14

标签: google-app-engine model google-cloud-datastore

我希望能够采用动态创建的字符串,比如“Pigeon”并在运行时确定Google App Engine是否在此项目中定义了名为“Pigeon”的Model类。如果“Pigeon”是一个存在的模型类的名称,那么我想获得对如此定义的Pigeon类的引用。

另外,我根本不想使用eval,因为在这种情况下动态字符串“Pigeon”来自外部。

3 个答案:

答案 0 :(得分:1)

你可以尝试,虽然可能非常非常糟糕的做法:

def get_class_instance(nm) :
    try :
        return eval(nm+'()')
    except :
        return None

另外,为了更安全,您可以给eval一个本地哈希:eval(nm+'()', {'Pigeon':pigeon})

我不确定这是否有效,而且肯定有一个问题:如果有一个名为nm的函数,它会返回:

def Pigeon() :
    return "Pigeon"
print(get_class_instance('Pigeon')) # >> 'Pigeon'

编辑:如果你知道模块,另一种方法可能是(未经测试):
(对不起,我一直忘记它不是obj.hasattr,它的hasattr(obj)!)

import models as m
def get_class_instance(nm) :
    if hasattr(m, nm) :
        return getattr(m, nm)()
    else : return None

编辑2 :是的,它确实有效!宇!

答案 1 :(得分:1)

实际上,通过查看源代码和interweb,我发现了一个似乎符合要求的无证方法。

from google.appengine.ext import db

key = "ModelObject" #This is a dynamically generated string

klass = db.class_for_kind(key)

如果该类不存在,此方法将抛出描述性异常,因此如果密钥字符串来自外部,您应该捕获它。

答案 2 :(得分:0)

有两种相当简单的方法可以在不依赖内部细节的情况下完成此任务:

使用google.appengine.api.datastore API,如下所示:

from google.appengine.api import datastore

q = datastore.Query('EntityType')
if q.get(1):
  print "EntityType exists!"

另一个选项是使用db.Expando类:

def GetEntityClass(entity_type):
  class Entity(db.Expando):
    @classmethod
    def kind(cls):
      return entity_type
  return Entity

cls = GetEntityClass('EntityType')
if cls.all().get():
  print "EntityType exists!"

后者的优点是你可以使用GetEntityClass为任何实体类型生成一个Expando类,并以与普通类相同的方式与它进行交互。