[Python-de] import Problem

Peter Otten __peter__ at web.de
Fr Jan 11 09:33:09 EST 2019


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.



Mehr Informationen über die Mailingliste python-de