2012-10-30 11 views
5

अजगर-3.3 से पहले, मैं पाया है कि एक मॉड्यूल hasattr(mod, '__loader__') के साथ एक कस्टम लोडर से लोड किया गया था। अजगर-3.3 के बाद, सभी मॉड्यूल एक कस्टम लोडर लोड करता है की परवाह किए बिना __loader__ विशेषता है।पायथन - आप कैसे पता लगाते हैं कि कस्टम लोडर द्वारा एक मॉड्यूल लोड किया गया है?

अजगर 2.7, 3.2:

>>> import xml 
>>> hasattr(xml, '__loader__') 
False 

अजगर-3.3:

>>> import xml 
>>> hasattr(xml, '__loader__') 
True 
>>> xml.__loader__ 
<_frozen_importlib.SourceFileLoader object at ...> 

मैं पता कैसे लगाते हैं कि एक मॉड्यूल एक कस्टम लोडर से लोड किया गया था?

उत्तर

1

__loader__ विशेषता के अस्तित्व के लिए सरल जाँच नहीं रह गया है अजगर 3.3 में पर्याप्त है। PEP 302 की आवश्यकता है कि सभी लोडर मॉड्यूल की __loader__ विशेषता में अपनी जानकारी संग्रहीत करें।

मैं type(module.__loader__) को देखने के लिए अगर मॉड्यूल कस्टम लोडर के साथ लोड किया गया था एक अतिरिक्त जांच जोड़ना होगा (या लोडर की एक सूची में) आप खोज रहे हैं:

>>> CUSTOM_LOADERS = [MyCustomLoader1, MyCustomLoader2] 
>>> type(xml.__loader__) in CUSTOM_LOADERS 
True 

यह एक से बुरा हो सकता है रखरखाव बिंदु-दृश्य, उसमें आपको कस्टम लोडर की सूची अद्यतित रखना होगा। एक और समान दृष्टिकोण मानक अंतर्निहित लोडर की एक सूची बना सकता है और चेक को not in STANDARD_LOADERS में बदल सकता है। यद्यपि यह अभी भी रखरखाव मुद्दा होगा।

+0

धन्यवाद। मेरे मामले में, मुझे पहले से CUSTOM_LOADERS सूची नहीं मिल सकती है। STANDARD_LOADERS बेहतर है, लेकिन मानक प्रक्रिया में तैयार करना थोड़ा मुश्किल है। >>> import importlib._bootstrap >>> loader_classes = tuple(x[0] for x in importlib._bootstrap._get_supported_file_loaders()) >>> isinstance(os.__loader__, tuple(loader_classes)) True >>> isinstance(sys.__loader__, tuple(loader_classes)) False >>> sys.__loader__

+0

मुझे लगता है कि 'STANDARD_LOADERS = file_loaders + (BuiltinImporter + FrozenImporter + zipimporter)'। –

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