verwenden von global

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
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Es haben viele imer gesagt, dass man das global statement möglichst wenig verwenden sollte.

Jetzt habe ich das "Problem":
Ich habe eine Konstante, welche ich in einem Modul sehr oft verwende. Diese könnte ich natürlich in jeder Funktion neu definieren mit const = wert.
Ist es in diesem Fall "erlaubt", diese als globale Konstante zu deklarieren?

Und wenn nicht, wofür verwendet man sonst global?
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Vermutlich hast Du die Verwendung von 'global' missverstanden. Konstanten kannst Du sehr wohl global definieren und es ist auch guter Stil dies zu tun:

Code: Alles auswählen

KONSTANTE = 42

def do_something(n):
    return KONSTANTE * n
Das keyword 'global' brauchst Du nur dann, wenn Du aus einem lokalen Namensraum heraus auf die KONSTANTE im Namensraum auf der Modulebene schreibend zugreifen willst. Dies aber kann zu Seiteneffekten führen und daher wird davon abgeraten. Dann wäre es zudem auch keine Konstante mehr.
Zuletzt geändert von kbr am Dienstag 2. August 2016, 09:55, insgesamt 1-mal geändert.
BlackJack

@Pygoscelis papua: Du vermutest ein Problem wo keines ist. Globaler Zustand ist Böse™, also *Variablen*. Du hast aber eine Konstante. Da braucht man auch kein ``global``.

Falls noch nicht bekannt, oder entfallen: Namenskonvention für Konstanten ist KOMPLETT_IN_GROSSBUCHSTABEN. :-)
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Ok ja ich habe global solange nicht mehr verwendet :) ich meine auch globale Konstanten.
Das mit den Großbuchstaben wahr mir von C auch noch geläufig.

Und in welchen fällen darf man auf globale variablen schreibend zugreifen? Nur so aus Interesse, ich
werde es wahrscheinlich nicht verwenden.
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Pygoscelis papua hat geschrieben:Und in welchen fällen darf man auf globale variablen schreibend zugreifen?
Nie. Es gibt IO, dass ist schon schlimm genug
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Was ist mit "IO" gemeint? Das hier: https://docs.python.org/3.5/library/io.html?
Und mit welcher begründung wurde dann das global statement aufgenommen?
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: Ich nehme mal an mit IO ist generell Input/Output gemeint, also globaler Zustand/Nebeneffekte.

``global`` ist in der Sprache um aus Funktionen und Methoden Namen auf Modulebene Werte zuweisen zu können. Das kann in sehr seltenen Fällen nützlich und sinnvoll sein.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Wenn ich schon gerade dabei bin:
Ich habe gerade PEP8 (Style Guide) gelesen, und bin dabei auf Function Annotations gestoßen z.B.:

Code: Alles auswählen

def munge(sep: AnyStr = None):
wozu wird das verwendet? Als Kommentar? Wenn ich das in den Interpreter eingebe sagt der mir, dass er AnyStr nicht kennt.
Also müsste ich eigentlich

Code: Alles auswählen

def munge(sep: "AnyStr" = None):
schreiben?
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: Das kann als alles Mögliche verwendet werden. Zur Typisierung oder um irgendwelche anderen Metadaten an Funktionssignaturen zu hängen, die dann von irgend einer Bibliothek ausgewertet werden können. Das ist einfach nur Syntax ohne festgelegte Semantik.

Ich finde es ziemlich unsinnig. Das wurde IMHO ohne klares Ziel in die Sprache reingebastelt, wobei einige dann als klares Ziel „Typannotationen“ verstanden haben, um Python so ein bisschen mehr Richtung statischer Typisierung zu drängeln. Es gibt aber auch andere Ideen wofür man das verwenden kann. Und es skaliert nicht, denn wenn man dann zwei verschiedene Bibliotheken im gleichen Projekt verwendet, die beide Annotationen für verschiedene Zwecke verwenden, hat man ein Problem.

Zu `AnyStr`, man müsste halt vorher `AnyStr` definieren. Sieht nach Typannotation aus, also wahrscheinlich in einer Bibliothek die dann irgendetwas mit dieser Information anfangen kann. Statische Prüfungen, JIT-Compiler, Dokumentationsgenerator — irgend etwas in der Richtung halt.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Ok den code habe ich direkt auss der Seite von PEP8: https://www.python.org/dev/peps/pep-0008/.
Also besser nicht verwenden? Kann es ein Fehler sein es nicht zu verwenden?
Bewirkt das denn Irgentetwas beim verwenden der Funktion? :

Code: Alles auswählen

def function(arg: str):
    print(arg)
function(1) # kein fehler
Oder ist es wirklich nur ein "Kommentar"
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: Das ist Information die in/an der Funktion gespeichert wird und von da auch wieder abgerufen werden kann. Und dann kann man damit *irgendwas* machen. Die Frage nach benutzen/nicht benutzen richtet sich also danach mit welcher Bibliothek oder welchem Werkzeug Du die Informationen dann verarbeitest.

Beim Verwenden der Funktion bewirkt das rein gar nichts.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

ok Danke!
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Seit Python 3.5 ist mit PEP 484 und dem typing Modul schon sehr eindeutig definiert wofür man Annotations nutzen soll.

Python selbst kommt allerdings ohne irgendein Werkzeug um diese Typen zu überprüfen :roll:
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Im PEP 484 steht:
"the proposal assumes the existence of a separate off-line type checker"
Meinst du den gibt es nicht mit
DasIch hat geschrieben:Seit Python 3.5 ist mit PEP 484 und dem typing
Python selbst kommt allerdings ohne irgendein Werkzeug um diese Typen zu überprüfen :roll:
?

Ich habe den hier gefunden: http://mypy-lang.org.
Oder was meintest du?

Ich denke das schleißt dann aber das hier aus: http://cython.readthedocs.io/en/latest/ ... onize.html
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
BlackJack

@Pygoscelis papua: *Python* bringt nichts mit um die Typannotationen zu prüfen. Man muss was externes installieren.
Pygoscelis papua
User
Beiträge: 206
Registriert: Freitag 13. März 2015, 18:36

Gut kein Wunder, wurde ja auch erst bei 3.5 eingeführt.
Wahrscheinlich kümmert sich auch keiner wirklich darum :)
import this
hidden python features

JAVA = Just Another Vulnerability Announcement :D
Antworten