我希望能够采取动态创建的字符串,说“鸽子”,并在运行谷歌应用程序引擎是否在这个项目命名为“鸽子”定义的模型类确定。如果“鸽子”是existant模型类的名称,我想然后到达如此限定鸽子类的引用。

另外,我不想使用eval可言,因为在这种情况下,动态字符串“鸽子”,来自外部的。

有帮助吗?

解决方案

有两个相当简单的方法来做到这一点,而不依赖于内部细节:

使用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类,并与它进行交互的相同方式的优点你将一个普通的类。

其他提示

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

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 :是的,它的工作!宇!

实际上,通过源代码和interweb来看,我发现,似乎适合的纸币一个无证方法。

from google.appengine.ext import db

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

klass = db.class_for_kind(key)

此方法将抛出一个描述性的异常,如果该类不存在,所以你应该抓住它,如果密钥字符串来自外部。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top