Code: Alles auswählen
>>> import funwithfoo
>>> funwithfoo.print_foo()
foo
>>> funwithfoo.set_foo('bar')
>>> funwithfoo.print_foo()
bar
>>> reload(funwithfoo)
<module 'funwithfoo' from 'funwithfoo.pyc'>
>>> funwithfoo.print_foo()
foo
Code: Alles auswählen
>>> import funwithfoo
>>> funwithfoo.print_foo()
foo
>>> funwithfoo.set_foo('bar')
>>> funwithfoo.print_foo()
bar
>>> reload(funwithfoo)
<module 'funwithfoo' from 'funwithfoo.pyc'>
>>> funwithfoo.print_foo()
foo
kann ich noch nicht damit lösen (oder nur noch nicht erkennen?).Eine allgemein gültige Handhabung dürfte sein statt globalen Zustand zu verwenden, den mit Argumenten/Parametern zu lokalem Zustand zu machen der herum gereicht wird.
Code: Alles auswählen
exit_event = Event()
Thread(target=print_time, args=(exit_event, 'myTimer', 2)).start()
serve(exit_event, 'myListener')
Ich sprach schon ganz bewusst vom ``import``-Statement und dem dafür typischen Verhalten. Wenn ich das selbe Modul in mehreren Untermodulen verwende, dann mache ich dies nicht mit einem ``reload``, sondern eben mit ``import``-Statements.derdon hat geschrieben:@snafu: Du hast beim zweiten `import` nicht das Modul nochmal importiert; die Zeile bewirkte nichts, weil sich das Modul noch im Cache befand. Mit `reload` wird es wirklich neu geladen und es gibt ein anderes Verhalten als du es dargestellt hast:
in C die main-Funktion. Python erzwingt diese nicht, dafür hat sich unter Python der `if __name__ == '__main__': Block etabliert. Von hier aus gibst Du Zuständigkeit an Funktionen oder Exemplare und deren Methoden ab (über Parameter). Innerhalb deren Implementation orchestrieren sie wiederum ihre Subaufrufe (sind eine Art lokales "main"). Das Scoping von Python (und der meisten anderen Sprachen ) folgt im wesentlichen dieser Idee. Im Idealfall sind Exemplare und Funktionen vollständig gekapselt - egal wo und zu welcher Zeit Du ein Exemplar erstellst oder ein Ergebnis einer Funktion erhältst - sie verhalten sich gleich und sind damit vorhersagbar.
Meine Definition "last resort = letzter Ausweg" (laut Wörterbuch). Dass dieser letzte Ausweg trotzdem oft genommen wird liegt einfach daran, dass C keine äquivalenten besseren Sprachmittel z.B. zur Fehlerbehandlung anbietet.snafu hat geschrieben:Dafür, dass ``goto`` ein "last resort" sein soll, wird es in echten Programmen - u.a. im C-Quelltext von Python und im Linux-Kernel - aber ganz schön oft verwendet. Wie passt das mit deiner Aussage zusammen? Sind das für dich allesamt schlechte Programmierer oder setzt du eine sehr spezielle Definition von "last resort" voraus?Darii hat geschrieben:global ist der "last resort". Genau wie goto in C.
Code: Alles auswählen
def gen():
global a
while a > 0:
yield a
a -= 1
print 'a as global'
a = 10
for i in gen():
print i, a, list(gen())
print a, list(gen())
#################################
def reentrant_gen(a):
while a > 0:
yield a
a -= 1
print 'a as parameter'
a = 10
for i in reentrant_gen(a):
print i, a, list(reentrant_gen(a))
print a, list(reentrant_gen(a))
Der einzige Ausweg ist zwangsläufig auch der letzte. Fakt ist, dass man bei goto sehr leicht übersehen kann, irgendwelche Ressourcen freizugeben, was für mich eigentlich ein Grund ist, es nicht benutzen zu wollen…BlackJack hat geschrieben:@Darii: ``goto`` ist nicht letzter Ausweg, sondern das Mittel der Wahl um die Sprünge, die in anderen Sprachen per Ausnahmebehandlung geregelt werden, in C zumindest ansatzweise umzusetzen.
Ich wage einfach mal die Behauptung, dass jeder, der bei C nicht verzweifelt, C nicht benutzen sollte. Ich hoffe ja, dass nach heartbeat & co endlich mal ein paar Leute aufgewacht sind…Es mag sicher Leute geben die beim C-Programmierung ständig am verzweifeln sind, aber das ist nicht der Masstab an dem man das festmachen sollte.
Haha, in der Tat kenne ich den Frust mit C - allerdings eher daher, dass mir Sprachmittel fehlen und man soviel "zu Fuss" erledigen muss. Aber Verzweiflung ist so ein starkes WortDarii hat geschrieben:Ich wage einfach mal die Behauptung, dass jeder, der bei C nicht verzweifelt, C nicht benutzen sollte.
Zugegeben fertige Alternativen gibt es noch keine, aber ich setze große Hoffnungen in Rust. Die Sprache ist zwar noch nicht fertig, aber die freuen sich über jeden Bugreport und das ist besser als den Kopf in den Sand zu stecken. Ich habe hoffentlich bald mal Zeit Rust bare metal auf einem Microcontroller auszuprobieren…Wenn dann effektiv niemand C benutzen sollte, fehlt irgendwie eine Alternative. Ich will ja nicht behaupten das C der Weisheit letzter Schluss ist, sehe aber nicht wodurch man es ersetzen sollte. Also ganz praktisch gesehen, nicht was theoretisch besser wäre.
Wenn man in C *IMMER* die Größe von Speichersegmenten checken muss warum macht die Sprache das nicht für mich? Das würde eine komplette Klasse von Fehlern ausschließen. Die Lehre aus Heartbleed sollte eben sein, dass man solch gravierende Sprachdefizite nicht durch QA oder (reklamierte) Fertigkeiten des Programmierers kompensieren kann.jerch hat geschrieben:Und wenn man sich heartbleed anschaut - nunja, da sind schon grobe Schnitzer drin gewesen. Das man in C IMMER die Größe von Pointern auf Arrays/Strings (oder allgemeiner Speicherbereiche) checken muss, ist hinlänglich bekannt. Traurig daran ist, dass das durch die angeblich zweistufige QA gekommen ist.