@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:
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:
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.