model
フィクスチャのモデルクラスを示すプロパティをフィクスチャに設定する、djangoフィクスチャシステムに少し似たものを実装したいと思います。こんな感じ
my_app.models.my_model
私の質問は、この「パス」が指すクラスのインスタンスを作成するために、このような文字列を処理する標準的な方法は何ですか。私はそれが次のように見えるべきだと思います:
- モジュール名とクラス名の部分に分割します
- モジュールをロードします(ロードされていない場合)
- モジュールからその名前でクラスを取得します
- それをインスタンス化する
どのくらい正確にそれを行う必要がありますか?
編集:私は汚い解決策を思いついた:
def _resolve_class(self, class_path):
tokens = class_path.split('.')
class_name = tokens[-1]
module_name = '.'.join(tokens[:-1])
exec "from %s import %s" % (module_name, class_name)
class_obj = locals()[class_name]
return class_obj
それは仕事ですが、execの使用と、フィクスチャの悪意のある準備によって実行を操作する可能性があるため、汚いです。それはどのように適切に行われるべきですか?