2011-12-27 3 views
6

私はコンフィギュレーションファイルを処理する柔軟なシンプル-しかしウェイとしてPython execfile()機能を使用しています - 基本的には、アイデアがある:dictへのPythonモジュールのインポート(execfile()のグローバルとして使用する)?

# Evaluate the 'filename' file into the dictionary 'foo'. 
foo = {} 
execfile(filename, foo) 

# Process all 'Bar' items in the dictionary. 
for item in foo: 
    if isinstance(item, Bar): 
    # process item 

これは私の設定ファイルは、の定義へのアクセス権を持っていることが必要ですBarクラス。この単純な例では、それは簡単です。私たちは空のdictではなくfoo = {'Bar' : Bar}を定義することができます。しかし、実際の例では、ロードしたいモジュール全体があります。そのための1つの明らかな構文は次のとおりです。

foo = {} 
eval('from BarModule import *', foo) 
execfile(filename, foo) 

はしかし、私はすでにトップレベルのファイルにBarModuleを輸入してきたので、私はちょうど直接BarModuleによって定義されたもののセットとしてfooを定義することができるはずのように思えますこのevalimportのチェーンを通過する必要はありません。

これを行うには単純な慣用方法がありますか?

+1

私はevalfileファイルが存在しません。あなたはexecfileを意味しますか? –

+0

Pythonは式と文を区別しているので、evalを使うのは明らかなアイデアではありません。 evalは式を評価することができます(例えば 'eval( '2 + 2')')、execは文(例えば 'exec 'a = 2 + 2')です。インポートはステートメントです。 –

+0

@ÉricAraujo:私はexecfileを意味しました。編集が行われました。 –

答えて

7

おそらく、モジュールによって定義された__dict__を使用できます。

1
>>> import os 
>>> str = 'getcwd()' 
>>> eval(str,os.__dict__) 

典型的な解決策は、GETATTR使用することである。

>>> s = 'getcwd' 
>>> getattr(os, s)() 
6

は辞書として(例えばモジュールのような)オブジェクトの属性を取得する組み込みvars()関数を使用。

関連する問題