2009-08-20 10 views
2

pythonの$$変数に似た構文がありますか?私が実際に試みているのは、値に基づいてモデルをロードすることです。

例えば、値がソングの場合、ソングモジュールをインポートします。 if文やlambadaを使うことができますが、PHPの$$変数に似た何かが非常に便利です。

私が後にしているのは、これと似たものです。

ビューで次に
from mypackage.models import [*variable] 

def xyz(request): 
    xz = [*variable].objects.all() 

*変数設定で定義されているか、comandlineから来ることができる値です。プロジェクト内のどのモデルでもかまいません。

答えて

3
def load_module_attr (path): 
    modname, attr = path.rsplit ('.', 1) 
    mod = __import__ (modname, {}, {}, [attr]) 
    return getattr (mod, attr) 

def my_view (request): 
    model_name = "myapp.models.Song" # Get from command line, user, wherever 
    model = load_module_attr (model_name) 
    print model.objects.all() 
+0

私の質問を理解しているかどうかはわかりません。私が達成しようとしていることは、これに似たものです。 *は変数が設定するかで定義されている値である XZ = [*変数] .objects.all():mypackage.modelsから は[*変数】図において次に DEF XYZ(リクエスト)をインポートcomandlineから来ることができます。プロジェクト内のどのモデルでもかまいません。あなたの方法は本当に問題を助けません。 – Mohamed

+0

私はコードを更新しました - それはあなたの問題に近いですか? –

+0

私はまだそれをテストしていませんが、構文的にはソリューションのように見えます。 – Mohamed

0

一般概念を知っているので、実装しようとしているものは「リフレクティブプログラミング」と呼ばれます。

あなたは私はあなたが__import__()をしたいかなり確信している

http://en.wikipedia.org/wiki/Reflective_programming

1

ここではWikipediaのエントリに複数の言語での例を見ることができます。

読む本:この関数はimport文によって呼び出されるdocs.python.org: __import__

。 import文のセマンティクスを変更するには、(builtinsモジュールをインポートしてbuiltins.__import__に代入することによって)置き換えることができますが、現在はインポートフックを使用する方が簡単です(PEP 302参照)。 __import__()を直接使用することはまれですが、実行時にのみ名前がわかっているモジュールをインポートする場合を除いてはまれです。

1

潜在的に一致するすべてのモジュール/モデルを手元にロードし、要求に応じて使用する特定のモジュール/モデルを選択すると思われるようです。文字列で索引付けできるグローバルレベル変数の辞書を返す "globals()"を使用できます。ですから、あなたがglobals()['Song']のようなことをすれば、それはあなたにソングモデルを与えます。これは、グローバルスコープの変数だけを取得する点を除いて、PHPの$$に似ています。ローカルスコープの場合は、locals()を呼び出す必要があります。

ここにいくつかのコード例を示します。

from models import Song, Lyrics, Composers, BlaBla 

def xyz(request): 
    try: 
     modelname = get_model_name_somehow(request): 
     model =globals()[modelname] 
     model.objects.all() 
    except KeyError: 
     pass # Model/Module not loaded ... handle it the way you want to 
関連する問題