Seite 1 von 1

module importieren

Verfasst: Freitag 29. Oktober 2010, 07:48
von Xynon1
Wieder eine eigentlich simple Frage.
Sagen wir Datei a.py enthählt folgenden Code:

Code: Alles auswählen

import random

A = 3
def do_something():
    pass

if __name__ == "__main__":
    b = 3
    do_something()
Nun importiere ich a.py:

Code: Alles auswählen

>>> import a
Jetzt kann ich ja logischerweise auf a.A, a.do_something() zugreifen aber nicht auf b.
Nun meine eigentlich Frage, da ich Module wie random Standardmäßig oben importiere, also nicht im Main-Bereich, kann ich ja auch auf a.random Zugreifen.

Ist sowas erwünscht ?
Also sollte ich wirklich noch mal random importieren, wenn ich es brauche, oder auf a.random zugreifen ?

Re: module importieren

Verfasst: Freitag 29. Oktober 2010, 07:51
von snafu
Nö, ich würde nochmal das eigentliche Modul explizit importieren und das nicht über Attributzugriffe von anderen Modulen machen, die es zufällig ebenfalls verwenden.

Re: module importieren

Verfasst: Freitag 29. Oktober 2010, 07:56
von Xynon1
Mach ich auch immer so, weil mir das andere unlogisch erscheint, nur warum besteht diese Möglichkeit.

bzw. das warum ist eigentlich klar, weil die Module ja oben im Globalen-Bereich importiert werden.
Aber ich finde es trotzdem ulkig warum dies möglich ist, gibt es da einen bestimmten Grund warum dies nicht unterbunden wird ?

Re: module importieren

Verfasst: Freitag 29. Oktober 2010, 09:57
von cofi
Xynon1 hat geschrieben:Aber ich finde es trotzdem ulkig warum dies möglich ist, gibt es da einen bestimmten Grund warum dies nicht unterbunden wird ?
Warum denn? Das zieht jede menge Sonderfaelle nach sich, denn ein Modul ist im Namespace eben auch nur irgendein Name und wenn du den fuer "externe" Module anders behandelst als fuer das momentane (und das muss man, wenn man Module nicht exportieren will) kommst du am ende mit 2 Namespaces raus oder hast jede Menge Ueberpruefungen zur Laufzeit.

Und warum?

Re: module importieren

Verfasst: Freitag 29. Oktober 2010, 10:37
von DrFaust
Sehe ich wie cofi. Python hat noch nie den Programmierer vor seiner eigenen Dummheit geschützt (anders als z.B. Java, die das ins Extrem getrieben haben). Ob ich dieses Beispiel jetzt schon als Dummheit bezeichnen würde weiß ich nicht. Aber grundsätzlich gilt in Python aber doch: Wenn der Programmierer meint etwas machen zu müssen das ihm vielleicht später auf die Füße fällt oder zumindest kein guter Stil ist, dann wird Python ihn nicht daran hindern.

Re: module importieren

Verfasst: Freitag 29. Oktober 2010, 10:47
von Xynon1
Wie wirkt sich das dann generell auf den Speicher aus ?
Also wenn zwei/mehr Scripte ganz normal das gleiche Modul importieren.

Greifen dann beide trotzdem auf das selbe Modul im speicher zu nur mit anderen Variablennamen und/oder anderen Namensraum, oder wird das importierte Modul für beide Zugriffe extra hinterlegt ?

Re: module importieren

Verfasst: Freitag 29. Oktober 2010, 11:44
von Hyperion
Xynon1 hat geschrieben: Greifen dann beide trotzdem auf das selbe Modul im speicher zu nur mit anderen Variablennamen und/oder anderen Namensraum, oder wird das importierte Modul für beide Zugriffe extra hinterlegt ?
Ohne es def. zu wissen würde ich davon ausgehen, dass dann das Modul-Objekt nur an einen anderen Namen gebunden wird und somit dasselbe bleibt.

Re: module importieren

Verfasst: Freitag 29. Oktober 2010, 12:02
von cofi

Code: Alles auswählen

%> echo "import os" > a.py
%> echo "import os" > b.py
%> echo "import a,b" > c.py
%> echo "print a.os is b.os" >> c.py
%> python c.py
True

Re: module importieren

Verfasst: Freitag 29. Oktober 2010, 12:15
von Hyperion
q.e.d. :-)

Weiß jemand, wie Python da intern vorgeht, um zu prüfen, ob ein Modul bereits im Speicher vorhanden ist? Woran erkennt Python das?

Edit: Ok, habe mal in der Shell die Liste sys.modules entdeckt und mal os importiert:

Code: Alles auswählen

In [17]: sys.modules["os"]
Out[17]: <module 'os' from 'C:\Programme\Python27\lib\os.pyc'>
Augenscheinlich ist der Pfad, woher ein Modul geladen wurde, das 'Erkennungsmerkmal'.

Edit2: Nee, wohl doch nicht:
python-2.7-docs-html/reference/simple_stmts.html#the-import-statement hat geschrieben: Once the name of the module is known (unless otherwise specified, the term “module” will refer to both packages and modules), searching for the module or package can begin. The first place checked is sys.modules, the cache of all modules that have been imported previously. If the module is found there then it is used in step (2) of import.
Also geht es doch "stumpf" über den Namen.

Re: module importieren

Verfasst: Montag 1. November 2010, 01:20
von Leonidas
Naja, zwei Module die genauso heißen importieren zu wollen, indem man zwischen dem ersten und den zweiten Import ``sys.path`` anpasst würde ich eher als "Bad Practice" ansehen.