2009-12-14 12 views
13

Wie kann auf ein Standard-Bibliotheksmodul (zB math) zugegriffen werden, wenn eine Datei prog.py im selben Verzeichnis abgelegt ist wie ein lokales Modul mit demselben Namen (math.py)?Zugriff auf ein Standardbibliotheksmodul in Python, wenn ein lokales Modul mit demselben Namen vorhanden ist?

Ich frage diese Frage, weil ich uncertainties ein Paket erstellen möchte, die man als

import uncertainties 
from uncertainties.math import * 

Somit kann ein lokales Mathematikmodul innerhalb der Unsicherheiten Verzeichnisses ist. Das Problem ist, dass ich auf das Standardbibliotheks-Mathematikmodul von Unsicherheiten/__ init__.py zugreifen möchte.

Ich möchte nicht Unsicherheiten.Math umbenennen, weil dieses Modul genau Funktionen aus dem Mathematikmodul (mit Äquivalenten, die numerische Unsicherheiten behandeln) ersetzt werden soll.

PS: Diese Frage bezieht sich auf das Modul, das ich geschrieben habe, um calculations with uncertainties durchzuführen, unter Berücksichtigung von Korrelationen zwischen Variablen.

Antwort

19

Sie suchen nach Absolute/Relative Importe aus PEP 328, erhältlich mit 2.5 and upward.

In Python 2.5 können Sie das Verhalten des Imports mit einer Anweisung von __future__ import absolute_import auf absolute Importe umstellen. Dieses absolute Importverhalten wird der Standard in einer zukünftigen Version (wahrscheinlich Python 2.7). Wenn absolute Importe die Standardeinstellung sind, wird Import Math immer die Version der Standardbibliothek finden. Es wird empfohlen, dass Benutzer so schnell wie möglich mit absoluten Importen beginnen sollten. Daher sollten Sie mit dem Schreiben von pkg import string in Ihrem Code beginnen.

Relative Einfuhren sind immer noch möglich, durch eine führende Periode zu dem Modulnamen hinzuzufügen, wenn die von ... Import Formular:

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

Validiert als Antwort: Dies beantwortet die Frage (auch wenn S. Lott mich davon überzeugt hat, dass ich einen anderen Weg gehen sollte :). – EOL

+0

Ja, ich würde Mathematik auch nicht als Modulnamen verwenden;) – mbarkhau

+4

"Wahrscheinlich in 2,7" - Das ist eigentlich nie passiert. 2.7 Benutzer benötigen die absolute_import-Zeile, wenn sie dieses Verhalten möchten. – Joe

5

Warum können Sie Ihr lokales Modul nicht noch einmal umbenennen?

Klar, es ist kein "totaler" Ersatz, wenn Sie noch Dinge von der installierten uncertainties benötigen.

Da es sich um einen teilweisen Ersatz handelt, sollten Sie ihm nicht den gleichen Namen geben.

Was ist anders? Was ist das Gleiche? Wählen Sie einen besseren Namen basierend darauf.

+0

+1: Zugegeben, es ist kein vollständiger Ersatz ist. Ich werde erwägen, das (zukünftige) Unsicherheiten.Math-Modul umzubenennen. PS: Das Standardmathematikmodul wird in uncertains.py verwendet, da Unsicherheiten durch mathematische Funktionen manipuliert werden, die Unsicherheiten nicht kennen (das Unsicherheiten.Math Modul könnte bei einer Geschwindigkeitskosten verwendet werden, da es allgemeiner als das Standardmathematikmodul ist) – EOL

+0

@EOL: Man kann nicht einfach etwas so Grundsätzliches wie "Mathe" durch ein anderes Modul gleichen Namens ersetzen. Zeitraum. Es ist verwirrend für die Benutzer. So viel wie Sie möchten, eine glatte, "Pin-to-Pin" Ersatz, tun Sie das nicht. Bitte nicht. Nennen Sie es "umath" oder etwas, das ** eindeutig ** angibt, dass es nicht "math" ist. –

+1

@S. Lott: Ja, ich hatte gedacht, dass "Importen Unsicherheiten.Math" klar wäre, ebenso wie "Unsicherheiten importieren Mathe", aber ich hatte versäumt zu sehen, dass 'math.sin()' verwirrend wäre. Ich werde es zu eurer Ehre umhauen. :) – EOL

Verwandte Themen