Referenzierung des globalen Scopes aus einer Klasse raus

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pdewaha
User
Beiträge: 1
Registriert: Donnerstag 21. Dezember 2006, 17:08

Donnerstag 21. Dezember 2006, 17:15

Hallo,
Hab mir erst vor 5 Stunden die Syntax von python reingezogen.
Hab nun eine Frage.



datei: net/test.py

Code: Alles auswählen

  CONST_BLA = 1

  class test:
       def __init__(self):
            tmp = CONST_BLA...
Wie kann ich aus einer Klasse heraus auf die Konstanten (Variablen) im globalen Scope des Moduls referenzieren?!

Ohne global CONST_BLA; in der Methode zu verwenden.

Bisher hab ich das nur hingekriegt mit eine fully qualified module name..

Also

Code: Alles auswählen

import net/test

tmp = net.test.CONST_BLA
Kann man nich einfacher auf das aktuelle modul referenzieren?!
Sowas wie self in Klassen, halt nur für module.

Im Stil von :

Code: Alles auswählen

 tmp  = thismodul.CONST_BLA

Hab eh noch einige Probleme damit klarzukommen das jede Datei gleich eine semantische Bedeutung hat. Manchmal will man ja einfach nur Code verteilen, und nicht gleich neue Module haben. Naja, komm halt aus der C Ecke..

danke im vorraus.
BlackJack

Donnerstag 21. Dezember 2006, 17:32

pdewaha hat geschrieben: datei: net/test.py

Code: Alles auswählen

 CONST_BLA = 1

  class test:
       def __init__(self):
            tmp = CONST_BLA...
Wie kann ich aus einer Klasse heraus auf die Konstanten (Variablen) im globalen Scope des Moduls referenzieren?!
Das geht genau so wie's da steht. Natürlich ohne die drei Punkte nach dem Namen der Konstante.
Ohne global CONST_BLA; in der Methode zu verwenden.
``global`` brauchst Du nur wenn Du einen Namen auf Modulebene von einer Funktion oder Methode aus an ein anderes Objekt binden willst. Aber das will man nicht. Vergiss die Existenz von ``global`` am besten gleich wieder. ;-)
Bisher hab ich das nur hingekriegt mit eine fully qualified module name..

Also

Code: Alles auswählen

import net/test

tmp = net.test.CONST_BLA
Die ``import``-Anweisung dürfte einen `SyntaxError` provozieren. Und das funktioniert auch nur wenn `net` ein Package ist.
Hab eh noch einige Probleme damit klarzukommen das jede Datei gleich eine semantische Bedeutung hat. Manchmal will man ja einfach nur Code verteilen, und nicht gleich neue Module haben. Naja, komm halt aus der C Ecke..
Wenn eigentlich zusammengehöriger Quelltext zu gross für ein Modul wird, ist es meistens ein guter Weg ein Package daraus zu machen und in der `__init__.py` das Ganze wieder per ``import`` nach aussen hin wie eine Einheit erscheinen zu lassen. Aber man sollte wirklich nur unabhängige Sachen ausgliedern. Wenn das mit einem Haufen Module endet, die sich gegenseitig importieren, dann ist die Aufteilung fragwürdig.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Donnerstag 21. Dezember 2006, 17:32

Code: Alles auswählen

CONST_BLA = 1

  class test:
       def __init__(self):
            tmp = CONST_BLA...
Wie kann ich aus einer Klasse heraus auf die Konstanten (Variablen) im globalen Scope des Moduls referenzieren?!
Tust du im obigen Beispiel. Wenn du nur lesen willst, werden, von innen nach aussen, alle Scopes durchgeguckt (afaik).

Wenn du schreiben willst, musst du vorher mit dem Keyword "global" darauf hinweisen:

Code: Alles auswählen

modulewide = 1
def tester():
  global modulwide
  modulwide = 2
Hab eh noch einige Probleme damit klarzukommen das jede Datei gleich eine semantische Bedeutung hat. Manchmal will man ja einfach nur Code verteilen, und nicht gleich neue Module haben.
Per __all__ in einem Modul kannst du diese Bedeutung deinen Wünschen anpassen.
Antworten