2017-08-04 4 views
1

Angenommen importieren I die folgenden zwei Module wie folgt:On Importmodule und Methodennamen in Python

from sympy import * 
from numpy import * 

Beide Module haben eine exp() Funktion definiert. Wie wählt Python welchen aus? Gibt es eine Möglichkeit, diese Funktionen nach dem Import der Module wie oben zu unterscheiden? Welcher Mechanismus gibt es, um den Benutzer zu warnen, wenn dies der Fall ist? Betrachten Sie den folgenden Satz von Befehlen in IDLE

=============================== RESTART: Shell =============================== 
>>> from sympy import * 
>>> from numpy import * 
>>> exp(5) 
148.4131591025766 
>>> c = symbols('c') 
>>> exp(c) 
Traceback (most recent call last): 
    File "<pyshell#162>", line 1, in <module> 
    exp(c) 
AttributeError: 'Symbol' object has no attribute 'exp' 
>>> 
=============================== RESTART: Shell =============================== 
>>> from sympy import * 
>>> c = symbols('c') 
>>> exp(c) 
exp(c) 

Es scheint, dass standardmäßig Python verwendet die exp() Definition in numpy jedoch, wenn es auf einem Objekttyp durch sympy erkannt genannt wird wirft es einen Fehler, der die sympy.exp() Funktion rendert nicht brauchbar.

Für diesen Fall weiß ich, dass die Funktionen in beiden Paketen vorhanden sind, aber was passiert, wenn ich nicht? Es sollte einen Mechanismus geben, der den Benutzer warnt, um wirklich verwirrende Situationen zu vermeiden .... Wie geht die Python-Gemeinschaft mit diesem Problem um?

+0

Sie benötigen Import als –

+0

Über die Fehler verwenden, die Sie sehen: NumPy des 'exp' in allen Fällen verwendet wird. Die Fehler rühren von der Tatsache her, dass die Funktion ein Array oder Array-artiges Objekt als Parameter erwartet hat; Irgendwann ruft NumPy 'exp' die' exp'-Methode für den übergebenen Parameter auf, was zu einem Fehler führt, weil SymPys 'Symbol's, wie angegeben, keine solche Methode haben. – jdehesa

Antwort

7

Es "wählt" nicht. Wenn Sie from sympy import * tun, importiert es alle Namen von sympy in den aktuellen Namespace; und wenn Sie from numpy import * tun, tut es das gleiche. Alles, was zuvor definiert wurde, wird überschrieben. Dies ist genau das gleiche wie wenn Sie getan haben:

foo = 'bar' 
foo = 'baz' 

Offensichtlich foo hat jetzt den Wert „baz“, auch wenn Sie es zunächst als „bar“.

Die Lösung ist dies nicht zu tun;

from sympy import exp, .... 
from numpy import .... 
+0

Aber was, wenn ich den 'exp' Befehl von * beiden * Bibliotheken benutzen möchte? In diesem Fall würde es immer noch überschrieben, d. H. Von sympy import exp; von numpy import exp' – user32882

+3

Also einfach 'import sympy; import numpy'; dann können Sie 'sympy.exp (foo)' und 'numpy.exp (foo)' tun. Oder, tue 'von sympy import ext als sympy_ext' usw. –

+1

Du solltest wahrscheinlich lesen [der klassische Importleitfaden des effbot] (http://effbot.org/zone/import-confusion.htm); Es ist alt, aber immer noch absolut gültig. –

0

Soweit ich weiß, und der Code nach, die numpy der exp() würde zu Ihrem Namensraum hinzugefügt werden, wie es das letzte Modul ist, das importiert wurde: Sie sollten die Dinge, die Sie explizit müssen importiert werden. Also, in diesem Fall gewinnt der letzte das Rennen! Um dies zu beheben, verwenden Sie einfach:

from toys import yo-yo as yo-yo1