global
macht die Variable für alle in der Modul die modulare Reichweite so, als ob Sie es auf oberster Ebene im Modul selbst definiert hätten. Es ist außerhalb des Moduls nicht sichtbar und kann nicht aus dem Modul importiert werden, bevor es festgelegt wurde.
Wann wird global
echte Probleme lösen? (Hinweis: Nur mit Python 3 geprüft.)
# Attempt #1, will fail
# We cannot import ``catbus`` here
# as that would lead to an import loop somewhere else,
# or importing ``catbus`` is so expensive that you don't want to
# do it automatically when importing this module
top_level_something_or_other = None
def foo1():
import catbus
# Now ``catbus`` is visible for anything else defined inside ``foo()``
# at *compile time*
bar() # But ``bar()`` is a call, not a definition. ``catbus``
# is invisible to it.
def bar():
# `bar()` sees what is defined in the module
# This works:
print(top_level_something_or_other)
# This doesn't work, we get an exception: NameError: name 'catbus' is not defined
catbus.run()
Dies kann behoben werden mit global
:
# Attempt #2, will work
# We still cannot import ``catbus`` here
# as that would lead to an import loop somewhere else,
# or importing ``catbus`` is so expensive that you don't want to
# do it automatically when importing this module
top_level_something_or_other = None
def foo2():
import catbus
global catbus # Now catbus is also visible to anything defined
# in the top-level module *at runtime*
bar()
def bar():
# `bar` sees what is defined in the module and when run what is available at run time
# This still works:
print(top_level_something_or_other)
# This also works now:
catbus.run()
Dies wäre nicht notwendig, wenn bar()
wurde definiert innerhalb foo
etwa so:
# Attempt 3, will work
# We cannot import ``catbus`` here
# as that would lead to an import loop somewhere else,
# or importing ``catbus`` is so expensive that you don't want to
# do it automatically when importing this module
top_level_something_or_other = None
def foo3():
def bar():
# ``bar()`` sees what is defined in the module *and* what is defined in ``foo()``
print(top_level_something_or_other)
catbus.run()
import catbus
# Now catbus is visible for anything else defined inside foo() at *compile time*
bar() # Which now includes bar(), so this works
Durch die Definition bar()
außerhalb von foo()
, bar()
kann in etwas importiert werden, das puede importieren catbus
direkt oder als Attrappe, wie in einem Einheitstest.
global
ist ein Codegeruch, aber manchmal braucht man genau einen schmutzigen Hack wie global
. Wie auch immer, "global" ist ein schlechter Name dafür, da es so etwas wie einen globalen Bereich in Python nicht gibt, es sind Module den ganzen Weg nach unten.