首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何动态确定Google App Engine中是否存在Model类?

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

Stack Overflow用户
提问于 2009-04-09 21:28:14
回答 3查看 221关注 0票数 1

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

另外,我根本不想使用eval,因为本例中的动态字符串"Pigeon“来自外部。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-03 14:15:57

有两种非常简单的方法可以在不依赖内部细节的情况下做到这一点:

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

代码语言:javascript
复制
from google.appengine.api import datastore

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

另一种选择是使用db.Expando类:

代码语言:javascript
复制
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类,并以与普通类相同的方式与其交互。

票数 0
EN

Stack Overflow用户

发布于 2009-04-09 21:33:46

您可以尝试一下,尽管这可能是非常非常糟糕的做法:

代码语言:javascript
复制
def get_class_instance(nm) :
    try :
        return eval(nm+'()')
    except :
        return None

此外,为了更安全,您可以为eval提供一个本地变量散列:eval(nm+'()', {'Pigeon':pigeon})

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

代码语言:javascript
复制
def Pigeon() :
    return "Pigeon"
print(get_class_instance('Pigeon')) # >> 'Pigeon'

编辑:如果你知道这个模块,另一种方法是可能的(未经测试):

(对不起,我总是忘记这不是obj.hasattr,而是hasattr(obj)!)

代码语言:javascript
复制
import models as m
def get_class_instance(nm) :
    if hasattr(m, nm) :
        return getattr(m, nm)()
    else : return None

EDIT 2:是的,它是有效的!哇!

票数 1
EN

Stack Overflow用户

发布于 2009-04-10 19:03:50

实际上,通过查看源代码和互联网,我发现了一种未记录的方法,它似乎符合要求。

代码语言:javascript
复制
from google.appengine.ext import db

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

klass = db.class_for_kind(key)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/735985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档