2009-04-09 1 views
1

ダイナミックに作成された文字列「Pigeon」を実行し、実行時にGoogle App Engineに「Pigeon」という名前のこのプロジェクトで定義されたModelクラスがあるかどうかを判断できます。 "Pigeon"が既存のモデルクラスの名前である場合、このように定義されたPigeonクラスへの参照を取得したいと思います。モデルクラスがGoogle App Engineに存在するかどうかを動的に判断する方法を教えてください。

また、動的な文字列 "Pigeon"が外部から来るので、私はevalを全く使用したくありません。

答えて

0

内部の詳細に依存することなく、これを実行するには、2つの非常に簡単な方法があります:

from google.appengine.api import datastore 

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

他のオプションを使用することです。そうは次のように

は、google.appengine.api.datastoreのAPIを使用します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!" 

後者は、あなたが任意のエンティティタイプについてはExpandoクラスを生成するためにGetEntityClassを使用し、そしてそれと同じように対話することができるという利点を持っていますあなたは普通のクラスになります。

1

あなたはおそらく非常に、非常に悪い習慣が、試みることができる:

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' 

EDIT
(申し訳ありませんが、私は、それがobj.hasattrていないそのはhasattr(OBJ)を忘れてください!)

import models as m 
def get_class_instance(nm) : 
    if hasattr(m, nm) : 
     return getattr(m, nm)() 
    else : return None 
:それを行う別の方法は、モジュールを知っていれば、おそらく(未テスト)であります

EDIT 2:はい、うまくいきます!うわー!

+0

「ピジョン」が外部から来る可能性があるので、ええ、私は指定しておくべきです、私は全く評価を使用したくありません。 –

+0

Affitmative。 (愚かなコメントの長さ - 私はちょうど "OK"と言っていたでしょう):D –

+0

evalは完全にここでは必要ありません。 –

1

実際、ソースコードとインターウェブを調べると、私は法案に合うように見える文書化されていない方法を見つけました。

from google.appengine.ext import db 

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

klass = db.class_for_kind(key) 

クラスが存在しない場合、このメソッドは、記述例外がスローされますので、キーの文字列は外から来る場合、あなたはおそらくそれをキャッチする必要があります。

関連する問題