Suche…


Einführung

Die spezielle Variable __name__ wird verwendet, um zu prüfen, ob eine Datei als Modul importiert wurde oder nicht, und um eine Funktion, eine Klasse oder ein __name__ anhand ihres Attributs __name__ zu identifizieren.

Bemerkungen

Die Python-Sondervariable __name__ wird auf den Namen des __name__ Moduls gesetzt. Auf der obersten Ebene (z. B. im interaktiven Interpreter oder in der Hauptdatei) wird '__main__' . Dies kann verwendet werden, um einen Anweisungsblock auszuführen, wenn ein Modul direkt ausgeführt und nicht importiert wird.

Das zugehörige spezielle Attribut obj.__name__ wird in Klassen, importierten Modulen und Funktionen (einschließlich Methoden) gefunden und gibt bei der Definition den Namen des Objekts an.

__name__ == '__main__'

Die spezielle Variable __name__ wird vom Benutzer nicht festgelegt. Es wird meistens verwendet, um zu prüfen, ob das Modul von alleine ausgeführt wird oder nicht, weil ein import durchgeführt wurde. Um zu vermeiden, dass Ihr Modul beim Importieren bestimmte Teile des Codes if __name__ == '__main__' , prüfen Sie, if __name__ == '__main__' .

Lassen Sie module_1.py nur eine Zeile lang sein:

import module2.py

Und mal sehen was passiert, abhängig von module2.py

Situation 1

module2.py

print('hello')

Wenn Sie module1.py ausführen, wird hello gedruckt
Wird module2.py ausgeführt, wird hello gedruckt

Situation 2

module2.py

if __name__ == '__main__':
    print('hello')

Wenn Sie module1.py ausführen, wird nichts gedruckt
Wird module2.py ausgeführt, wird hello gedruckt

Funktionsklasse_oder_Modul .__ Name__

Das spezielle Attribut __name__ einer Funktion, Klasse oder eines Moduls ist eine Zeichenfolge, die ihren Namen enthält.

import os

class C:
    pass

def f(x):
    x += 2
    return x


print(f)
# <function f at 0x029976B0>
print(f.__name__)
# f

print(C)
# <class '__main__.C'>
print(C.__name__)
# C

print(os)
# <module 'os' from '/spam/eggs/'>
print(os.__name__)
# os

Das __name__ Attribut ist jedoch nicht der Name der Variablen, die auf die Klasse, Methode oder Funktion verweist, sondern der Name, den sie bei der Definition erhalten hat.

def f():
    pass

print(f.__name__)
# f - as expected

g = f
print(g.__name__)
# f - even though the variable is named g, the function is still named f

Dies kann unter anderem zum Debuggen verwendet werden:

def enter_exit_info(func):
    def wrapper(*arg, **kw):
        print '-- entering', func.__name__
        res = func(*arg, **kw)
        print '-- exiting', func.__name__
        return res
    return wrapper

@enter_exit_info
def f(x):
    print 'In:', x
    res = x + 2
    print 'Out:', res
    return res

a = f(2)

# Outputs:
#     -- entering f
#     In: 2
#     Out: 4
#     -- exiting f

Zur Protokollierung verwenden

Beim Konfigurieren der integrierten logging wird häufig ein Protokollierer mit dem Namen __name__ des aktuellen Moduls erstellt:

logger = logging.getLogger(__name__)

Dies bedeutet, dass der vollständig qualifizierte Name des Moduls in den Protokollen angezeigt wird, sodass Sie leichter erkennen können, woher die Nachrichten stammen.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow