2011-09-28 15 views
7

मेरे पास एक बच्चे पैकेज से मॉड्यूल है जो गतिशील रूप से आयात किया जाता है; मैं कक्षाओं में कैसे पुन: प्रयास कर सकता हूं?गतिशील रूप से आयातित मॉड्यूल में परिभाषित कक्षाओं को दोहराएं

मैं मॉड्यूल का आयात किया गया है और इस तरह नामों की सूची:

package = current_module.__name__ 
package = package[:package.rindex(".")] # get the package 
package = "%s.sub.%s"%(package,name) # make the name of the child 
print "(loading package %s)"%package 
module = __import__(package) # this succeeds 
for name,obj in inspect.getmembers(module): 
    print name,type(obj) 

यह केवल प्रिंट मॉड्यूल गुण है और वर्ग के प्रकार है कि मॉड्यूल परिभाषित करता है:

__builtins__ <type 'dict'> 
__doc__ <type 'NoneType'> 
__file__ <type 'str'> 
__name__ <type 'str'> 
__package__ <type 'NoneType'> 
__path__ <type 'list'> 
imported_package <type 'module'> 

अद्यतन

ऐसा लगता है कि मेरी कक्षाएंमें नहीं हैंजब तकfromlist खाली नहीं है! सूची में मान मान्य होने लगते हैं; [""] बस ठीक काम करता प्रतीत होता है, और अचानक कक्षाएं दिखाई देती हैं!

क्या कोई यह समझा सकता है कि यह क्यों है?

(मानक ubuntu अजगर 2.7.1+ (r271: 86,832)

उत्तर

17

उदाहरण: एक dict वर्गों के लिए नामों के नक्शे बनाने के लिए:

dict([(name, cls) for name, cls in mod.__dict__.items() if isinstance(cls, type)]) 

जहां आधुनिक लोड मॉड्यूल

है
+0

यह तब तक काम नहीं कर रहा है जब तक कि आयात में कोई सूची-खंड नहीं है; प्रश्न अपडेट किया गया। – Will

+0

ओह और मामूली बिंदु मुझे लगता है कि आप एक कोशिश ब्लॉक में निरंतर जारी करने के लिए सही हैं? – Will

+0

(पहला) आप सूचीसूची के बारे में सही हैं: मैं आमतौर पर ' कोई नहीं] 'इसके लिए। पता नहीं क्यों जरूरी है। (दूसरा) नहीं , मैं वास्तव में 'isinstance',' issubclass' नहीं और 'try' के बिना मतलब था। प्रत्येक वर्ग भी प्रकार 'प्रकार' का एक वस्तु है। – pvoosten

संबंधित मुद्दे