Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.python > #5401
| From | Hermann Riemann <nospam.ng@hermann-riemann.de> |
|---|---|
| Newsgroups | de.comp.lang.python |
| Subject | Re: [Python-de] import Problem |
| Date | 2019-01-11 17:09 +0100 |
| Message-ID | <g9rte5Fk8jvU1@mid.individual.net> (permalink) |
| References | <g9r8r8Ffq9nU1@mid.individual.net> <171918211.9ehmPdll05@palindrom> <mailman.195.1547217215.4816.python-de@python.org> |
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
Back to de.comp.lang.python | Previous | Next — Previous in thread | Find similar
import Problem Hermann Riemann <nospam.ng@hermann-riemann.de> - 2019-01-11 11:18 +0100
Re: [Python-de] import Problem Achim Herwig <python@wodca.de> - 2019-01-11 11:28 +0100
Re: [Python-de] import Problem Hermann Riemann <nospam.ng@hermann-riemann.de> - 2019-01-11 15:42 +0100
Re: [Python-de] import Problem Peter Otten <__peter__@web.de> - 2019-01-11 15:33 +0100
Re: [Python-de] import Problem Hermann Riemann <nospam.ng@hermann-riemann.de> - 2019-01-11 17:09 +0100
csiph-web