كيف يمكنني تحديد ما إذا كانت فئة نموذجية موجودة في محرك تطبيق Google؟
-
09-09-2019 - |
سؤال
أريد أن أكون قادرا على أخذ سلسلة تم إنشاؤها ديناميكيا، ويقول "حمامة" وتحديد وقت التشغيل ما إذا كان محرك 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)
ستقوم هذه الطريقة بإلقاء استثناء وصفي إذا كانت الفئة غير موجودة، بحيث يجب عليك التقاطه إذا كانت السلسلة الرئيسية تأتي من الخارج.