2012-10-30 8 views
5

Prima di Python-3.3, ho rilevato che un modulo è stato caricato da un caricatore personalizzato con hasattr(mod, '__loader__'). Dopo Python-3.3, tutti i moduli hanno l'attributo __loader__ indipendentemente dal fatto che vengano caricati da un caricatore personalizzato.Python - Come si rileva che un modulo è stato caricato dal caricatore personalizzato?

Python-2.7, 3.2:

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

Python-3.3:

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

Come faccio a rilevare che un modulo è stato caricato da un caricatore personalizzato?

risposta

1

Il semplice controllo dell'esistenza dell'attributo __loader__ non è più sufficiente in Python 3.3. PEP 302 richiede che tutti i caricatori memorizzino le loro informazioni nell'attributo __loader__ di un modulo.

Vorrei aggiungere un ulteriore controllo per la type(module.__loader__) per vedere se il modulo è stato caricato con il caricatore personalizzato (o in un elenco di caricatori) si sta cercando:

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

Questo può essere un male da un punto di vista della manutenzione, in quanto dovrete mantenere aggiornato l'elenco dei caricatori personalizzati. Un altro approccio simile potrebbe essere quello di creare un elenco di caricatori incorporati standard e modificare il controllo in not in STANDARD_LOADERS. Questo avrà comunque il problema di manutenzione.

+0

Grazie. Nel mio caso, non riesco a ottenere l'elenco CUSTOM_LOADERS in anticipo. STANDARD_LOADERS è migliore, ma è un po 'difficile da preparare nella procedura standard. >>> 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

Penso che 'STANDARD_LOADERS = file_loaders + (BuiltinImporter + FrozenImporter + zipimporter)'. –

Problemi correlati