كيف يمكنني تحديد ما إذا كانت فئة نموذجية موجودة في محرك تطبيق Google؟

StackOverflow https://stackoverflow.com/questions/735985

سؤال

أريد أن أكون قادرا على أخذ سلسلة تم إنشاؤها ديناميكيا، ويقول "حمامة" وتحديد وقت التشغيل ما إذا كان محرك Google App يحتوي على فئة نموذجية محددة في هذا المشروع باسم "Pigeon". إذا كان "حمامة" هو اسم فئة طراز موجودة، أود بعد ذلك الحصول على إشارة إلى فئة الحمام المحددة لذلك.

أيضا، لا أريد استخدام eval على الإطلاق، لأن السلسلة الديناميكية "حمامة" في هذه الحالة، تأتي من الخارج.

هل كانت مفيدة؟

المحلول

هناك طريقتان سهلا إلى حد ما للقيام بذلك دون الاعتماد على التفاصيل الداخلية:

استخدم 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 لأي نوع من الكيان، والتفاعل معها بنفس الطريقة التي ستكون بها فئة طبيعية.

نصائح أخرى

يمكنك المحاولة، على الرغم من ممارسة سيئة للغاية للغاية:

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

أيضا، لجعل ذلك أكثر أمانا، يمكنك إعطاء تقييم هاش السكان المحليين: 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