laden von modulen

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
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Hi Leute,
Ich hab erst vor ein paar Tagen mit Python angefangen und bin noch ziemlich unerfahren. Es kann auch sein, dass ich die falsche Terminologie benutze, also entschuldigt mich, wenn ich mich missverständlich/unpräzise ausdrücke. Ich habe in einer Datei eine Funktion unter dem Namen "function" abgespeichert. Hier das Pyhton Script:

Code: Alles auswählen

def f(x,y):
    return x+y
    
print "Hallo"
In einer anderen Datei (Name "test") möchte ich diese Funktion aufrufen (beide Dateien sind im gleichen Ordner):

Code: Alles auswählen

import function 

z=f(2,8)
print z
Gibt es eine Möglichkeit, dass nicht das gesamte Pyhton script "function" geladen wird, sondern NUR die Funktion? Wenn ich den Befehl in test ausführe, dann wird erst "Hallo" geprintet und dann erst die Funktion ausgeführt, was ja auch logisch ist, da das gesamte script "function" geladen wird. Gibt es eine Möglichkeit, nur die Funktion aufzurufen, sodass der Befehl " print "Hallo" " nicht ausgeführt wird?

Edit(cofi): Code Highlighting.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen im Forum und zu Python!

Nein, diese Moeglichkeit gibt es nicht und im Allgemeinen will man das auch nicht.

Es gibt aber ein Idiom um Module sowohl als Bibliothek, d.h. importierbar, als auch als Programm zu benutzen.
Dabei stellt man den gesamten Code fuer die Programmausfuehrung unter eine `if`-Abfrage.

In deinem Fall wuerde das Modul so aussehen:

Code: Alles auswählen

def f(x, y):
    return x + y

if __name__ == '__main__':
    print "Hallo"

Code: Alles auswählen

import modul

print modul.f(42, 23)
Hintergrund ist, dass `__name__` an den String "__main__" gebunden wird, wenn das Skript als Programm ausgefuehrt wird, beim importieren enthaelt es den Modulnamen.

Da Einrueckung wichtig ist, benutze in Zukunft bitte [ python] [ /python] Tags um deinen Code zu kennzeichnen und um zu verhindern dass Einrueckungen entfernt werden.
BlackJack

@möppi: Bei einem ``import`` wird der Code auf Modulebene ausgeführt. Nur die Funktion kannst Du schon alleine deswegen nicht importieren weil die Funktion `f()` erst existiert, nach dem der Code auf Modulebene in `function` mindestens bis zu der ``def``-Anweisung ausgeführt wird, mit der `f()` definiert wird. Vorher gibt es den Namen `f` überhaupt nicht.

Mal als Beispiel:

Code: Alles auswählen

print f

def f(x, y):
    return x + y
Wenn Du das importierst bekommst Du einen `NameError` weil zu dem Zeitpunkt wo das ``print`` ausgeführt wird, der Name `f` noch gar nicht existiert. So herum funktioniert es hingegen:

Code: Alles auswählen

def f(x, y):
    return x + y

print f
Hier wird erst die ``def``-Anweisung ausgeführt welche die dort beschriebene Funktion an den Namen `f` bindet, und danach kann man das Funktionsobjekt dann über den Namen `f` verwenden.

Was man allerdings machen kann ist in einem Modul feststellen ob es importiert oder direkt als Programm aufgerufen wurde. In Modulen ist der Name `__name__` definiert. Und der ist an eine Zeichenkette mit dem Namen des Moduls gebunden. Ausser wenn das Modul nicht importiert, sondern als Programm ausgeführt wird, dann ist der Name an die Zeichenkette '__main__' gebunden. Und das kann man natürlich prüfen (``function.py``):

Code: Alles auswählen

def f(x, y):
    return x + y

if __name__ == '__main__':
    print 'Hallo'
Wenn Du das importierst, dann ist `__name__` an die Zeichenkette mit dem Wert 'function' gebunden, und die ``print``-Anweisung wird nicht ausgeführt.

Das wird üblicherweise benutzt um eine Funktion mit dem Hauptprogramm aufzurufen. Die heisst in der Regel `main()`. Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Unter anderem damit man jedes Modul importieren kann, ohne das irgendwelcher Code abläuft, den man zu dem Zeitpunkt gar nicht laufen haben möchte.

BTW: Ich weiss `f()` ist nur eine eher sinnfreie Beispielfunktion, aber falls Du wirklich mal genau diese Funktion benötigst: Die gibt es schon unter dem Namen `add` im `operator`-Modul in der Standardbibliothek.
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

Ganz allgemein noch: Man sieht auch oft folgendes:

Code: Alles auswählen

# Klassen, Functionen, ...

def main():
    # hier kommt alles rein, was ausgeführt werden soll, wenn das Modul/Script direkt ausgeführt wird

if __name__ == '__main__':
    main()
Antworten