Ci sono delle insidie quando si sostituisce un modulo Python usando sys.modules?

0

In un mio progetto corrente, ho deciso di non inserire alcuna quantità significativa di codice in __init__.py file, semplicemente perché non mi piacciono. Nella mia testa, un file __init__.py è solo lì per informare Python che la cartella è un modulo. Continuo a dimenticare che potrebbero contenere molto codice proprio come qualsiasi altro modulo Python.

In questo progetto ho deciso di creare un sottomodulo "principale" ogni volta che sono tentato di inserire quantità significative di codice in un file __ini__.py , quindi importare il sottomodulo "principale" in __init__.py e sostituire il modulo .

Ad esempio, supponiamo di avere un modulo denominato alpha :

alpha/
  __init__.py

E voglio mettere un paio di costanti e metodi di supporto sotto il modulo alpha . Invece di mettere il codice in __init__.py creo un nuovo modulo chiamato (per esempio) main :

alpha/
  __init__.py
  main.py

Poi ho messo le mie cose in quel modulo. Poi lo metto in __init__.py :

import sys
import alpha.main

sys.modules["alpha"] = alpha.main

Ora posso inserire elementi in alpha/main.py :

author = "John Hancock"
maintainer = "John Hancock"

E accedici in questo modo:

import alpha

print(alpha.maintainer)

Funziona perfettamente, e mi piace che non debba più modificare __init__.py file.

Tuttavia, questo tipo di "magia" mi dà sempre la sensazione che un ninja Python più esperto mi taglierebbe in faccia se mi catturasse.

Questa convenzione mi sembra del tutto innocua, ma potrebbe tornare a mordermi in culo più tardi? Ci sono delle insidie che dovrei cercare?

    
posta Hubro 28.10.2015 - 16:13
fonte

1 risposta

1

Un'alternativa che non abusa di Python così tanto, è mettere quanto segue in __init__.py

from .main import *

Non è proprio come sostituire il modulo, ma sospetto che funzionerà nella maggior parte dei casi.

Tuttavia, vorrei prendere la teoria che non dovresti farlo. Far finta che il tuo codice sia nella radice del modulo alfa quando non è solo confuso.

    
risposta data 28.10.2015 - 16:25
fonte

Leggi altre domande sui tag