2015-03-17 9 views
7

un impopolare ma "supportato" pitone mod (vedi Guido: https://mail.python.org/pipermail/python-ideas/2012-May/014969.html) che consente l'utilizzo __getattr__ modulo attributi comporta quanto segue:moduli importate diventa nessun caso di sostituzione del modulo corrente a sys.modules utilizzando un oggetto classe

import os, sys 

class MyClass(object): 

    def check_os(self): 
     print os 

sys.modules[__name__] = MyClass() 

all'importazione, questo modulo importato diventa un'istanza di classe:

>>> import myModule 
>>> myModule 
<myModule.MyClass object at 0xf76def2c> 

Tuttavia, in Python-2.7, tutti gli altri moduli importati all'interno del modulo originale è impostato su Nessuno.

>>> repro.check_os() 
None 

In Python-3.4, tutto funziona:

>>> repro.check_os() 
<module 'os' from '/python/3.4.1/lib/python3.4/os.py'> 

Questo si sente come qualcosa a che fare con Imported modules become None when running a function, ma, qualcuno sa perché questo accade internamente?

Sembra che se si memorizza il modulo originale (senza sostituire completamente in Python-2) poi tutto continua a funzionare:

sys.modules[__name__+'_bak'] = sys.modules[__name__]  

risposta

5

Il problema si esegue in a è che in Pythons prima del 3.4 quando un modulo viene distrutto (poiché il tuo è perché lo si sostituisce con una classe e non vi sono ulteriori riferimenti ad esso), gli elementi in tale modulo __dict__ vengono impostati forzatamente su None.

La soluzione, se è necessario supportare Pythons prima di 3.4, è avere un import dichiarazione nella classe che sostituirà il modulo:

class MyClass(object): 

    import os 

    def check_os(self): 
     print(os) 

Per ulteriori informazioni, vedere this answer about interpreter shutdown.