2012-02-13 8 views
0

私は設定ファイルとして機能する小さなpythonスクリプトを持っています。構造は私がproject.を記述する必要はありませんように、プロジェクトのすべての属性のためオブジェクト属性をグローバル変数としてインポート

db1=project.db1 
db2=project.db2 

のようなものを紹介したいと思います簡単に表記について

project=Project(param1=..., param2=..., ...) 
project.add_plugins(P1(data=project.db1()), 
        P2(data=project.db2())) 
project.run_plugins(get_selected()) 

のようなものです。あなたは、すべての属性に対して自動的にこれを行う良い方法を提案できますか?

+0

私はそれが可能であっても、それはお粗末になる可能性が高いので、それをしないことをお勧めします。むしろ 'project'を' proj'や 'P'のように短い名前に変更するべきです。 –

答えて

1

私は(あなたの質問に私のコメントを参照)、それは良いアイデアだとは思わないが、あなたは内蔵のglobalsでそれを行うことができます。

for attr in dir(project): 
    if not attr.startswith("_"): 
     globals()[attr] = getattr(project, attr) 

私はそれはないと思う理由それは、論理的に名前付きの名前空間で非常にきれいに包まれていたもので、グローバルな名前空間を汚染するということです。あなたはより良いものからより悪いものへ行く。

のPythonの禅(import this)は読み込む最後の行があります。

Namespaces are one honking great idea -- let's do more of those!
+0

解決に感謝します!しかし、あなたはすべての背景を知らずに質問に質問するので、コメントは正確に建設的ではありません。これは、中間ユーザーのための構成スクリプトの一部であり、完全なプログラムではありません。だからそれはうまくいくはずです。 – Gerenuk

1

書き込みからあなたを止めるものは何もありません:

db1=project.db1 
db2=project.db2 

それはDB1とDB2があることをあなたの例から見えますメソッド。もしそうなら、あなたは割り当てをして、db1()またはdb2()を望むように呼び出すことができます。

変更可能な属性の場合は、それらを安全に変更することができますが、ショートネームを再バインドしても元のアトリビュートには影響しません(インポートから作成された名前を再バインドしてもオリジナルには影響しません)。

Pythonの標準ライブラリでは、このトリックをいくつかの場所で使用しています。たとえばRandomクラスを公開しても、それのインスタンスを作成し、平野の名前を通じて、そのインスタンスのメソッドをエクスポートしたrandom.pyを見て:私はの__all__リストを構築するためにデコレータを使用し、自動的にそれを行うには

# Create one instance, seeded from current time, and export its methods 
# as module-level functions. The functions share state across all uses 
#(both in the user's code and in the Python libraries), but that's fine 
# for most programs and is easier for the casual user than making them 
# instantiate their own Random() instance. 

_inst = Random() 
seed = _inst.seed 
random = _inst.random 
uniform = _inst.uniform 
triangular = _inst.triangular 
... 

(あなたがあなたのモジュールをインポートしている人のために必要な)エクスポートされた名前を作成して、クラスをインスタンス化した後に別々に名前を作成します。

__all__ = [] 
def exported(f): 
    __all__.append(f.__name__) 
    return f 
class Project: 
    @exported 
    def db1(self): ... 
project = Project() 

for name in __all__: 
    if hasattr(project, name): 
     globals()[name] = getattr(project, name) 
関連する問題