2016-04-14 6 views
1

私はモジュラブルアプリケーションを作成しようとしているので、メインアプリケーションを変更せずに新しいモジュールを作成できる方法が必要です。これを行うために、私はフォルダからすべてのモジュールをインポートすることができるモジュールシステムを準備しています。たとえば、クラス属性を使用して、使用するモジュールを選択します。すべてのモジュールを1つのフォルダにインポートし、その属性の1つで使用する

モジュール:

topology_O.py

class Topology(object): 
    def __init__(self): 
     self.name = 'O' 
     self.version = 0.1 

    def __str__(self): 
     string = "Topology: " + self.name 
     string += "Version: " + str(self.version) 
     return string 

topology_H.py

class Topology(object): 
    def __init__(self): 
     self.name = 'H' 
     self.version = 0.1 

    def __str__(self): 
     string = "Topology: " + self.name 
     string += "\n > Version: " + str(self.version) 
     return string 

私はこのようにそれらを使用したい:だから

myTopology = some_topology_thing('O') 
print myTopology 
# Topology: O 
# > Version: 0.1 

myTopology = some_topology_thing('H') 
print myTopology 
# Topology: H 
# > Version: 0.1 

MODU lesはnameによって選択され使用されます。

+1

を、私はあなたにも、 'name'の属性に基づいて、同様に必要な必要なモジュールをインポートするとし...ただ? 'some_topology_thing( 'O')' - > Auto import topology_O ...のようなものですか? –

+0

@IronFistはい私が必要なものです – efirvida

+1

それから私はマイク・ミュラーのものが私が投稿するものと同じになると信じています:) –

答えて

4

importlibはここに助けることができる:

import importlib 

def some_topology_thing(topo_type): 
    mod = importlib.import_module('topology_{}'.format(topo_type)) 
    return mod.Topology() 
+0

あなたがちょっとした患者だったら...私は同じように答えるでしょう: ...あまりにも悪い –

+0

あなたは同じ解決策を思いついたようにまともな答えのように見えます。 ;) –

+0

そう... ...それは起こったので、私は数か月前に 'importlib'モジュールについて読みましたが、私はインポートの仕組みを理解しようとしていました...とにかく、インポートする方法は...とにかく...これは –

1

私自身のソリューション

import os 
import imp 
from glob import glob 

def some_topology_thing(topology): 
    topologys = {} 

    module_path = os.path.join(os.path.dirname(__file__), '..', 'topologys') 
    modules = glob(module_path + '/*.py') 

    for i in modules: 
     foo = imp.load_source('', i) 
     topologys.update({foo.Topology().name: i}) 

    try: 
     return imp.load_source('', topologys[topology]).Topology() 
    except ImportError: 
     print "Error: no topology \'" + topology + "\' Found" 
     print "Available topologys are: " + str(topologys.keys()) 
+1

すべての例外をキャッチすることは本当に有利ではありません。デバッグを容易にするために例外をキャッチするほうが良いと思います。 'except ImportError: ' –

+0

@IronFistのヒントをありがとう – efirvida

関連する問題