Re: [Python-de] import Problem
Am 11.01.19 um 15:33 schrieb Peter Otten:
Hermann Riemann wrote:
Gegeben große Datei mit
z=6
def a(): global z # viel code print("in a") z-=1 if z>0: b() # viel code
def b(): global z # viel code print("in b") a() # viel code
Die soll zerlegt werden in ma.py:
z=6
def a(): global z # viel code print("in a") z-=1 if z>0: b() # viel code
mb.py:
def b(): global z # viel code print("in b") a() # viel code
Der Aufruf von
from ma import * from mb import *
*-Imports sind meist keine gute Idee. Hier sehe ich zwei Probleme:
- a referenziert b und b referenziert a, es gibt also einen reference-cycle. Da eines der beiden Module beim Import noch nicht initialisiert ist, wird die entsprechende Funktion nicht in den Namespace des anderen kopiert.
- Beide Module enthalten unabhängig voneinander den Namen z. Nach der ersten Zuweisung enthalten die Variablen also verschieden Werte.
Mit normalen Imports kannst du dich für ein Modul entscheiden; wenn
z = ...
in ma definiert ist, kannst du von mb lesend und schreibend mit dem qualifizierten Namen darauf zugreifen:
print(ma.z) ma.z += 42
Auch mb.b und mb.a sind beide zum Zeitpunkt des ersten Zugriffs definiert.
Unabhängig von konkreten Problemen würde ich mir den Code noch einmal daraufhin ansehen, ob er sich so umformulieren lässt, dass der reference- cycle vermieden wird.
Eine hässliche Lösung ist:
for i in *.py;do echo "***************" $i;cat $i;done *************** g.py d={} *************** ma.py from g import * z=6
def a(): global z # viel code print("in a") z-=1 if z>0: d['b']() # viel code d['a']=a *************** mb.py from g import * def b(): # viel code print("in b") d['a']() # viel code d['b']=b *************** mm.py from g import * from ma import * from mb import * d['a']() python3 mm.py liefert das erhoffte Ergebnis. -- http://www.hermann-riemann.de
participants (1)
-
Hermann Riemann