Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.python > #5401
| Path | csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail |
|---|---|
| From | Hermann Riemann <nospam.ng@hermann-riemann.de> |
| Newsgroups | de.comp.lang.python |
| Subject | Re: [Python-de] import Problem |
| Date | Fri, 11 Jan 2019 17:09:41 +0100 |
| Lines | 115 |
| Message-ID | <g9rte5Fk8jvU1@mid.individual.net> (permalink) |
| References | <g9r8r8Ffq9nU1@mid.individual.net> <171918211.9ehmPdll05@palindrom> <mailman.195.1547217215.4816.python-de@python.org> |
| 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 | <mailman.195.1547217215.4816.python-de@python.org> |
| Content-Language | de-DE |
| Xref | csiph.com de.comp.lang.python:5401 |
Show key headers only | View raw
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