Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.python > #5401

Re: [Python-de] import Problem

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>

Show all headers | 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 | NextPrevious in thread | Find similar


Thread

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