2016-04-14 11 views
1

Modüle edilebilir bir uygulama oluşturmaya çalışıyorum, bu yüzden ana uygulamayı değiştirmeden yeni modüller oluşturmamı sağlayan bir yönteme ihtiyacım var. Bunu yapmak için, tüm modülü bir klasörden almama izin veren modül sistemini hazırlıyorum ve kullanmak için, kullanacağınız modülü bir sınıf niteliği kullanarak seçmek istiyorum.Tüm modülleri bir klasörde içe aktarın ve özelliklerini bir özniteliği ile kullanın

modülleri:

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 

böyle bunları kullanmak istiyorum: Yani

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 tarafından seçilecek ve kullanılacaktır.

+1

Ben de dayanarak yanı gerekli gerekli modül almak istediğiniz varsayalım 'özelliğini name' ... sadece 'some_topology_thing (' O ') '-> Otomatik import topology_O ... gibi? –

+0

@IronFist evet, – efirvida

+1

'a ihtiyacım var. O zaman Mike Müller'in birinin aynı olacağını düşünüyorum. :) –

cevap

4

importlib burada yardımcı olabilir:?

import importlib 

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

Sadece biraz sabırlı olsaydınız ... aynı şekilde cevap verirdim ...:/... çok kötü –

+0

Aynı çözümden geldiğinizden çok iyi bir cevap gibi görünüyor. ;) –

+0

Yea ... çünkü ithalat mekanizmasını anlamaya çalıştığım gibi importlib modülü hakkında birkaç ay önce okuduğum ... ve başka bir şekilde nasıl ithal edeceğimi ... her neyse ... bu olmalı benim düşünceme göre OP için doğru yolu .. –

1

Kendi Çözüm

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

Her bir istisnayı yakalamak gerçekten uygun değildir, bence siz sadece bunu yükselteceğini düşündüğünüz istisnayı yakalayın, hata ayıklama kolaylığı için: ImportError: ' –

+0

ipucu @IronFist için teşekkürler – efirvida

İlgili konular