Code: Alles auswählen
import test
test.test()
Code: Alles auswählen
import test
test.test()
Code: Alles auswählen
def define():
import tkinter as tk
def test():
print(tk.TOP)
return locals()['test']
function = define()
function()
Code: Alles auswählen
def test_exec():
exec("""
import tkinter as tk
def test():
print(tk.TOP)
""")
return locals()['test']
function = test_exec()
function()
Code: Alles auswählen
def test_exec():
exec("""
import tkinter as tk
def test():
print(tk.TOP)
test()
""", locals())
return locals()['test']
Man kann das zu ladende Script so schreiben, dass es sich nicht besonders unerwartet verhält, etwa so:BlackJack hat geschrieben:Wenn `exec()` nicht sowieso schon etwas wäre was man nicht benutzen sollte wenn es da keinen richtig guten Grund gibt, dann schon gar nicht so das dieses überraschende Verhalten entsteht. Das muss man entweder *sehr* deutlich dokumentieren, oder die `script_exec()`-Funktion so schreiben das sich die Ausführung nicht so unerwartet verhält.
Code: Alles auswählen
def main():
import tkinter as tk
print(tk.BOTTOM)
a = 5
def test():
print(tk.TOP)
print(a)
test()
main()
Code: Alles auswählen
print(tk.BOTTOM)
def test():
print(tk.TOP)
test()
print(parameters)
test_function()
global global_var
global_var = "Globale Variable"
returnwert = "Returnwert"
Code: Alles auswählen
import tkinter as tk
def script_exec(filename,parameters):
exec(compile(open(filename, "r").read(), filename, 'exec'))
if 'returnwert' in locals():
return locals()['returnwert']
def test_function():
print("Testfunktion")
global_var = 5
returnwert = script_exec('test.py',"Testparameter")
print(returnwert)
print(global_var)
Jede Aktion des Benuters ändert Zustände. Sind dann alle Zustände global, oder geht es vielmehr nicht um globale Zustände, sondern im interne Zustände von Objekten die sich verändern.jerch hat geschrieben:Edit: Vllt. wird damit klarer, dass das eigentliche Problem die Kontrollierbarkeit globaler Zustände ist.
Genau darum geht es aber, um sauber aufgebauten Code, der gerade ein Interface zur Entkopplung von Interna der Implementierung erlaubt und so erst richtig saubere Programmierung ermöglicht. Es kann nämlich eine kreuz und quer Programmierung nicht angehen. Kein GUI Element hat nach einem anderen zu suchen, um dort einzutragen, welche Methode dieses bei ihm aufrufen soll. Da wäre auch das Problem, welches der beiden GUI Elemente zuerst existiert, auf welchem Pfad man da gehen muß, und ob die Namen nicht irgendwann geändert werden. Das gäbe einen ganz schönen Verhau. Ich habe natürlich eine Klasse, die auch mehrmals instanziert werden darf und auch dafür gedacht ist. Nur die GUI soll genau auf ein und dieselbe Instanz zugreifen, die speziell für die GUI vorgesehen ist. Bisher hatte ich da ein globales Objekt erzeugt. Das Objekt an alle GUI Container als Parameter bei der Instanziereung zu übermitteln, erscheint mir keine gute Idee zu sein. Aber jetzt ist mir eine Lösung eingefallen.BlackJack hat geschrieben:Die Bibliothek (matplotlib) eignet sich also eher weniger als Beleg für Deinen Ansatz. Man hat zwar quasi *ein* Exemplar das global ist, aber das besteht aus sauber aufgebautem Code der einem auch erlaubt nichtglobale Zustände zu erstellen und zu verwenden.
Code: Alles auswählen
f = open('/tmp/blabla', 'w')
# some code
...
f.write(foo)
...
f.write(bar)
...
f.close()
Code: Alles auswählen
def do_liste(value,liste=[]):
liste.append(value)
print(liste)
do_liste(1)
do_liste(2)
do_liste(2)
Code: Alles auswählen
def do_liste(value,liste=[]):
liste.append(value)
print(liste)
do_liste(1)
do_liste(2)
do_liste(3,[])
do_liste(4)
Das geht auch ohne Interface:Alfons Mittelmeyer hat geschrieben:Und was noch besser ist: niemand kann von außen darauf zugreifen, es sei denn man implementiert noch ein Interface, dann aber nur über das Interface.
Code: Alles auswählen
do_liste.__defaults__[0]
Code: Alles auswählen
>>> do_liste.__defaults__[0]
[1, 2]
>>> do_liste.__defaults__[0].pop()
2
>>> do_liste(3)
[1, 3]
Code: Alles auswählen
def should_be_known_by_two_classes(key,parameters,obj=SomeClass()):
# ...
return something
ShouldKnow1()
ShouldKnow2()
should_be_known_by_two_classes = None
ShouldntKnow()
Ich will ein globales Objekt vermeiden. Das wäre ja wohl ein globales Object oder, oder nicht?Sirius3 hat geschrieben:@Alfons Mittelmeyer: ... man kann daher nicht sagen, was Du damit bezwecken willst. Ich vermute aber, nichts sinnvolles.
Code: Alles auswählen
obj = SomeObject()
ShouldKnow1(obj)
ShouldKnow2(obj)
obj = None
ShouldntKnow()
Code: Alles auswählen
class ShouldKnow():
def __init__(self,obj):
self.obj = obj
def output(self):
print(self.obj)
def function():
# ich definiere das objekt in einer Funktion
obj = [1,2,3]
return ShouldKnow(obj)
a = function()
# aber es ist immer noch global da
a.output()