Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Hermann Riemann Newsgroups: de.comp.lang.python Subject: Re: [Python-de] import Problem Date: Fri, 11 Jan 2019 17:09:41 +0100 Lines: 115 Message-ID: References: <171918211.9ehmPdll05@palindrom> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Trace: individual.net x1bubb6H12+4bm7nuO9ASAu8S0l70pYtM4nlAjdtqEkguu0O8k Cancel-Lock: sha1:c2vsOLl1hd7kNsEFqoRq2Pu+ntg= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.0 In-Reply-To: Content-Language: de-DE Xref: csiph.com de.comp.lang.python:5401 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