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


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

Re: [Python-de] import Problem

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 | 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