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?
verwenden von global
-
- User
- Beiträge: 206
- Registriert: Freitag 13. März 2015, 18:36
Vermutlich hast Du die Verwendung von 'global' missverstanden. Konstanten kannst Du sehr wohl global definieren und es ist auch guter Stil dies zu tun:
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.
Code: Alles auswählen
KONSTANTE = 42
def do_something(n):
return KONSTANTE * n
Zuletzt geändert von kbr am Dienstag 2. August 2016, 09:55, insgesamt 1-mal geändert.
@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.
Falls noch nicht bekannt, oder entfallen: Namenskonvention für Konstanten ist KOMPLETT_IN_GROSSBUCHSTABEN.
-
- 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.
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.
-
- 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?
Und mit welcher begründung wurde dann das global statement aufgenommen?
@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.
``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.
-
- 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.:
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
schreiben?
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):
Also müsste ich eigentlich
Code: Alles auswählen
def munge(sep: "AnyStr" = None):
@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.
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.
-
- 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? :
Oder ist es wirklich nur ein "Kommentar"
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
@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.
Beim Verwenden der Funktion bewirkt das rein gar nichts.
-
- User
- Beiträge: 206
- Registriert: Freitag 13. März 2015, 18:36
ok Danke!
-
- 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
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
"the proposal assumes the existence of a separate off-line type checker"
Meinst du den gibt es nicht mit
?
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
@Pygoscelis papua: *Python* bringt nichts mit um die Typannotationen zu prüfen. Man muss was externes installieren.
-
- 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
Wahrscheinlich kümmert sich auch keiner wirklich darum