Как динамически определить, существует ли класс Model в Google App Engine? - PullRequest
1 голос
/ 10 апреля 2009

Я хочу иметь возможность взять динамически созданную строку, скажем «Голубь», и определить во время выполнения, есть ли в Google App Engine класс модели, определенный в этом проекте под названием «Голубь». Если «Pigeon» - это имя существующего модельного класса, я хотел бы получить ссылку на класс Pigeon, определенный таким образом.

Кроме того, я вообще не хочу использовать eval, так как динамическая строка «Голубь» в данном случае исходит извне.

Ответы [ 3 ]

1 голос
/ 10 апреля 2009

На самом деле, просматривая исходный код и веб-страницу, я нашел недокументированный метод, который, кажется, отвечает всем требованиям.

from google.appengine.ext import db

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

klass = db.class_for_kind(key)

Этот метод вызовет описательное исключение, если класс не существует, поэтому вы, вероятно, должны его перехватить, если строка ключа пришла извне.

1 голос
/ 10 апреля 2009

Вы можете попробовать, хотя, вероятно, очень, очень плохую практику:

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 : Да, это работает! Woo!

0 голосов
/ 03 мая 2009

Есть два довольно простых способа сделать это, не полагаясь на внутренние детали:

Используйте API google.appengine.api.datastore, например:

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 для любого типа сущности и взаимодействовать с ним так же, как и с обычным классом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...