2009-12-14 9 views
13

Come si può accedere a un modulo di libreria standard (ad esempio la matematica) quando un file prog.py viene inserito nella stessa directory di un modulo locale con lo stesso nome (math.py)?Come accedere a un modulo di libreria standard in Python quando esiste un modulo locale con lo stesso nome?

che sto chiedendo questa domanda, perché vorrei creare un pacchetto uncertainties che si può usare come

import uncertainties 
from uncertainties.math import * 

Pertanto, non v'è un modulo matematico locale all'interno della directory incertezze. Il problema è che voglio accedere al modulo matematico della libreria standard dalle incertezze/__ init__.py.

Preferisco non rinominare le incertezze.math perché questo modulo è precisamente destinato a sostituire le funzioni del modulo matematico (con equivalenti che gestiscono le incertezze numeriche).

PS: questa domanda riguarda il modulo che ho scritto per l'esecuzione di calculations with uncertainties tenendo conto delle correlazioni tra le variabili.

risposta

19

Siete alla ricerca di importazioni assolute/relative da PEP 328, disponibili con 2.5 and upward.

In Python 2.5, è possibile cambiare il comportamento dell'importazione in importazioni assolute utilizzando una direttiva __future__ import absolute_import. Questo comportamento di importazione assoluta diventerà il valore predefinito in una versione futura (probabilmente Python 2.7). Una volta che le importazioni assolute sono quelle predefinite, la matematica di importazione troverà sempre la versione della libreria standard. È consigliabile che gli utenti inizino a utilizzare il più possibile le importazioni assolute, quindi è preferibile iniziare a scrivere dalla stringa di importazione del pkg nel codice.

importazioni relativi sono ancora possibili con l'aggiunta di un punto iniziale per il nome del modulo quando si utilizza il modulo da ... importazione:

from __future__ import absolute_import 
# Import uncertainties.math 
from . import math as local_math 
import math as sys_math 
+0

Validato come risposta: questo risponde alla domanda (anche se S. Lott mi ha convinto che dovrei seguire un'altra strada :). – EOL

+0

Sì, non userei nemmeno la matematica come nome del modulo;) – mbarkhau

+4

"Probabilmente in 2.7" - Che in realtà non è mai successo. 2.7 utenti hanno bisogno della riga absolute_import se vogliono questo comportamento. – Joe

5

Perché non è possibile rinominare nuovamente il modulo locale?

Chiaramente, non è una sostituzione "totale", se sono ancora necessarie le cose dal uncertainties installato.

Poiché si tratta di una sostituzione parziale, non si dovrebbe dare lo stesso nome.

Cosa c'è di diverso? Qual è lo stesso? Scegli un nome migliore basato su quello.

+0

+1: scontato, non è una sostituzione completa. Prenderò in considerazione la possibilità di rinominare il (futuro) modulo incertezze. PS: il modulo matematico standard è usato in uncertainties.py perché le incertezze sono manipolate attraverso funzioni matematiche che non conoscono le incertezze (il modulo incertezze.math potrebbe essere usato, ad un costo di velocità, poiché è più generale del modulo matematico standard – EOL

+0

@EOL: non puoi semplicemente sostituire qualcosa di fondamentale come "matematica" con un altro modulo con lo stesso nome. Periodo. È fonte di confusione per gli utenti. Per quanto desideri fornire una sostituzione "pin-to-pin" uniforme, non farlo. Per favore non farlo. Chiamalo "umath" o qualcosa che ** chiaramente ** afferma che non è "matematica". –

+1

@S. Lott: Sì, avevo pensato che "import uncertainties.math" sarebbe stato chiaro, così come "dalle incertezze importare la matematica", ma non ero riuscito a vedere che 'math.sin()' sarebbe stato confuso. Lo battezzerò umath in tuo onore. :) – EOL