Seite 1 von 3

global oder nicht global

Verfasst: Donnerstag 15. Mai 2014, 13:08
von gNeandr
Hier wird in mehreren Beiträgen davon abgeraten 'global' einzusetzen.

Wenn Python 'global' definiert, dh. zulässt, warum sollte es nicht eingesetzt werden?
Für eine pro/con Aussage wäre ich dankbar :?:

Re: global oder nicht global

Verfasst: Donnerstag 15. Mai 2014, 13:46
von mutetella
gNeandr hat geschrieben:Wenn Python 'global' definiert, dh. zulässt, warum sollte es nicht eingesetzt werden?
Es liegt IMHO nicht in der Verantwortung einer Sprache, alles, von dem abgeraten wird, auch zu verbieten. Letztlich auch gar nicht möglich. Selbst wenn es das ``global`` Statement nicht gäbe, könnte man mit dem Rest noch genügend schlechten oder gar gefährlichen Code schreiben... :wink:

Von der Nutzung globaler Namen/Variablen wird ja nicht nur in Python, sondern auch in anderen Sprachen abgeraten.

mutetella

Re: global oder nicht global

Verfasst: Donnerstag 15. Mai 2014, 13:50
von Darii
gNeandr hat geschrieben:Wenn Python 'global' definiert, dh. zulässt, warum sollte es nicht eingesetzt werden?
Weil man nicht alles, was man tun kann, auch immer tun sollte.

Warum global oft eine schlechte Idee ist möchte ich hier nicht wiederkäuen, siehe die entsprechenden Beiträge, aber der Name deutet es schon an. Man sollte es nur und nur ausschließlich für die Verwaltung von globalen Zuständen verwenden und selbst da gibt es oft bessere Alternativen. global ist der "last resort". Genau wie goto in C.

Re: global oder nicht global

Verfasst: Donnerstag 15. Mai 2014, 14:20
von darktrym
Goto kann den Code vereinfachen, global ist einfach nur schlechtes Design.

Re: global oder nicht global

Verfasst: Donnerstag 15. Mai 2014, 14:33
von /me
gNeandr hat geschrieben:Wenn Python 'global' definiert, dh. zulässt, warum sollte es nicht eingesetzt werden?
Man schafft sich Abhängigkeiten die nach einiger Zeit nur noch schwer zu durchblicken sind. Ja, global kann durchaus mal nützlich sein, aber in über 99% der Fälle wo jemand es verwenden möchte ist der Einsatz nicht gerechtfertigt. Unter Python 3 gibt es noch nonlocal das nicht so dramatische Auswirkungen auf den globalen Namensraum hat.

Mal abgesehen davon, dass man global ohnehin möglichst nicht einsetzen sollte, muss man es im Eigeninteresse weglassen sobald man mit Threads zu tun hat. global ist nicht thread-safe.

Re: global oder nicht global

Verfasst: Donnerstag 15. Mai 2014, 17:01
von BlackJack
Lesestoff zum Thema globale Variablen: http://c2.com/cgi/wiki?GlobalVariablesAreBad

Ist nicht speziell auf Python ausgerichtet sondern allgemein, darum sind einige Punkte, zum Beispiel was Linker in statisch typisierten Programmiersprachen angeht, nicht so einfach übertragbar, aber da ist auch genug allgemeines dabei.

Re: global oder nicht global

Verfasst: Donnerstag 15. Mai 2014, 21:28
von gNeandr
@alle die geantwortet haben :D
Danke für den reichlichen Lesestoff .. werd es mir zu Gemüte führen

Re: global oder nicht global

Verfasst: Freitag 16. Mai 2014, 08:34
von jerch
In Python führt global an Modulen eine Zustandsabhängigkeit ein - eine Sache die man zu 99,9% der Fälle definitiv nicht haben möchte. Da Python OOP und Closures kennt, hatt man doch viel mächtigere Werkzeuge zur Hand, mit denen man das erreichen kann und bei denen man als Programmierer auch erwartet, dass diese zustandsbehaftet sind bzw. sein können. Für Module gilt das nicht, von ``import ...`` bis zum Ende des Programmes sollten Module möglichst nebeneffektsfrei sein.

Re: global oder nicht global

Verfasst: Samstag 31. Mai 2014, 11:41
von gNeandr
Also eher 'nicht global'.

Ich habe versucht eine allgemein gültige Handhabung von 'global's zu finden, wobei ich allerdings nicht in "Standard" Python recherchiert habe. Ergebnis eher mau :(

Eine Möglichkeit könnte sein:

Code: Alles auswählen

#  closure to handle global parameters
def gParam():
   parameter = {}
   def set(n, x):
      # just monitoring 
      print (n + " is:" + str(x))
      parameter[n] = x
   def get(n):
      return parameter[n]
   return set, get
gSet,gGet=gParam()
Dann kann ich an jeder Stelle im Code globals setzen bzw abfragen.

Code: Alles auswählen

gSet = ('parameterA', anyvalue)
localPa = gGet('parameterA')
Also ist dieser Weg OK, bessere Methode bekannt, evtl. weiterführende Links ?

Schönes Wochenende
Günter

Re: global oder nicht global

Verfasst: Samstag 31. Mai 2014, 11:52
von Sirius3
@gNeandr: Python kennt globale Variablen, man muß sich also keinen Workaround selber stricken. Besser wird die Benutzung von globalen Variablen dadurch definitiv nicht!

Re: global oder nicht global

Verfasst: Samstag 31. Mai 2014, 11:55
von gNeandr
@Sirius3

... vielleicht hab ich den ganzen Thread falsch verstanden? ... oder wer?

Ja 'global's in Python gibt's keine Frage, aber auch Schwierigkeiten damit ... oder nicht? :?

Re: global oder nicht global

Verfasst: Samstag 31. Mai 2014, 12:00
von pillmuncher
@gNeandr: Das Problem mit global ist nicht, dass es als syntaktisches Konstrukt irgendwie gefährlich wäre, sondern dass globaler Zustand in einem Programm schlecht ist. Ob man den globalen Zustand dann mittels des Keywords global oder mittels Closures einführt/verwaltet, ist Jacke wie Hose.

Re: global oder nicht global

Verfasst: Samstag 31. Mai 2014, 12:03
von snafu
Darii hat geschrieben:global ist der "last resort". Genau wie goto in C.
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?

Re: global oder nicht global

Verfasst: Samstag 31. Mai 2014, 12:06
von darktrym
Globale Variablen ist in allen Programmiersprachen zu meiden egal ob nur lesend oder schreibend. Ein Workaround nur damit das Wort global nicht auftaucht, machts nicht besser. Nebenbei, dein Beispiel ist so wenig pythonisch, dass geht auch als Antipattern durch(Getter/Setter, Unnötige Klammern, Stringadditionen,...).

Re: global oder nicht global

Verfasst: Samstag 31. Mai 2014, 12:13
von gNeandr
darktrym hat geschrieben:...
Nebenbei, dein Beispiel ist so wenig pythonisch, dass geht auch als Antipattern durch(Getter/Setter, Unnötige Klammern, Stringadditionen,...).
Gerne lerne ich dazu! In einem anderen Thread habe ich darauf hingewiesen, dass ich Python Neuling bin :lol:
Manches kommt halt aus meiner anderweitigen 'Vergangenheit' und dem 'Bedarf' nach Übersichtlichkeit (aber das ist sicher Geschmack & Gewohnheit)
Deshalb auch die Frage nach Links etc ... zb. wo finde ich gute Hinweise zu Getter/Setter in Python?