Seite 1 von 1

Definition von Funktionen n Python 3.4

Verfasst: Freitag 1. April 2016, 12:24
von Python22
Hallo folgendes Problem:

Das Programm

x=1
f()
print("x:",x)

zeigt mir folgende Fehlermeldung obwohl ich die Funktion f() vorher definiert und in shell gespeichert habe bzw. laufen lassen habe.

Folgende Fehlermeldung kommt immer wieder:

Traceback (most recent call last):
File "C:/Python34/Projekte/def.py", line 2, in <module>
f()
NameError: name 'f' is not defined


f() wie folgt vorher definiert:

def f():
x=2
print("x:",x)


Was mache ich falsch?

MFG

Re: Definition von Funktionen n Python 3.4

Verfasst: Freitag 1. April 2016, 12:35
von Sirius3
@Python22: was heißt "in shell gespeichert"? Die Funktion muß in Deinem Skript def.py definiert oder importiert werden.

Re: Definition von Funktionen n Python 3.4

Verfasst: Freitag 1. April 2016, 12:47
von Python22
Ah ok danke. jetzt funktionierts.
Ich wollte das separat machen . aber das geht dann wohl leider nicht.
Also um das mal klar zu stellen: Die Definitionen und das Hauptprogramm müssen in einem Skript stehen .ja?

Re: Definition von Funktionen n Python 3.4

Verfasst: Freitag 1. April 2016, 12:59
von Sirius3
@Python22: nein, aber das "Hauptprogramm" muß alles, was es braucht entweder selbst definieren oder importieren.

Re: Definition von Funktionen n Python 3.4

Verfasst: Freitag 1. April 2016, 13:01
von BlackJack
@Python22: Nein die können auch in verschiedenen Modulen stehen, aber man muss die Funktion dann in das Modul importieren in dem sie benutzt werden soll.

Wenn Du anfängst Programme zu schreiben die aus mehr als einem Modul bestehen, solltest Du allerdings am besten auch gleich ein Package verwenden in dem die zusammengefasst werden, damit die einzelnen Module nicht alle auf oberster Ebene im Suchpfad für ``import`` stehen und eventuell mit Modulen oder Packages von anderen Autoren kollidieren.

Re: Definition von Funktionen n Python 3.4

Verfasst: Freitag 1. April 2016, 13:16
von pixewakb
Was meinst du mit Package!?

Wenn ich das hier richtig verstehe:
http://www.learnpython.org/en/Modules_and_Packages

, dann sind Packages Ordner mit Unterordnern, in denen Skripte liegen. Ich sehe nicht, dass die installiert werden, d. h. ein Hauptprogramm würde im obersten Verzeichnis liegen, dann käme ein package-Ordner im obersten Verzeichnis, der andere Modul-Ordner enthält. Vorteil ist, dass ich lokal darauf zurückgreifen muss und nichts installieren muss!?

Bitte korrigiere mich, wenn ich - wahrscheinlich - falsch liege. Ich könnte das aktuell für eine Aufgabe vielleicht gut gebrauchen.

Re: Definition von Funktionen n Python 3.4

Verfasst: Freitag 1. April 2016, 13:42
von snafu
@pixewakb
Ein Verzeichnis wird zum Package, wenn es eine `__init__.py` enthält. Wenn sich innerhalb des Verzeichnisses noch Unterverzeichnisse befinden, die ebenfalls eine `__init__.py` enthalten, dann sind es Subpackages.

Mit einer Unterscheidung zwischen Installieren oder Selberschreiben hat das nichts zu tun.

Re: Definition von Funktionen n Python 3.4

Verfasst: Freitag 1. April 2016, 13:48
von BlackJack
@pixewakb: Mit Package meine ich genau das was Du beschreibst, also fast, denn ich würde da drin nichts als Skripte bezeichnen, das sind in erster Linie Module.

Es geht auch nicht zwingend darum etwas zu installieren. Das aktuelle Verzeichnis liegt normalerweise als erstes im Suchpfad für Importe, also konkurrieren alle Module die man da ablegt mit allen anderen Modulen im Suchpfad und verdecken die. Wenn also das eigene Programm auf Module von ausserhalb zugreift, und dafür können auch schon Module aus der Standardbibliothek ausreichen, und die wiederrum auf ein Modul oder Package zugreifen wollen welches den gleichen Namen wie eines was man selbst geschrieben hat, und nun das verdecken was eigentlich gemeint war, hat man ein Problem. Das ist in Python 3 durch die absoluten Importe etwas besser geworden, aber selbst da würde ich diesen globalen Namensraum so wenig wie möglich beanspruchen.

Ich persönlich würde auch das Programm in das Package stecken, so dass wirklich nur ein Name auf oberster Ebene übrig bleibt. So machen das auch viele Programme. Da besteht das systemweit installierte Programm dann im Grunde nur aus dem Import und Aufruf der Hauptfunktion aus einem Package/Modul. Ein Beispiel dafür direkt aus der Standardinstallation wäre IDLE wo das Programm nur aus diesen Zeilen besteht:

Code: Alles auswählen

#! /usr/bin/python

from idlelib.PyShell import main
if __name__ == '__main__':
    main()
`idlelib` ist also der einzige Name der im Import-Suchpfad auftaucht. Das gesamte Programm mit all seinen Modulen ist in diesem Package zusammengefasst.

Bei IPython und pip sieht es ähnlich aus. Auch nur 4 bis 5 Zeilen die eine Funktion aus dem Package importieren und ausführen.

Re: Definition von Funktionen n Python 3.4

Verfasst: Freitag 1. April 2016, 16:20
von BlackJack
@pixewakb: Als Nachtrag das so ein Problem auch genau umgekehrt passieren kann: Ich habe eine Webanwendung die als Module im gleichen Verzeichnis statt als Package organisiert ist und die hat ein Modul mit dem Namen `config`. Und jetzt kann ich das nicht mehr importieren weil irgendeiner der Meinung war ein gleichnamiges Modul global installieren zu müssen, welches jetzt vor meinem im Suchpfad liegt und erfolgreich verhindert das meine Webanwendung an *ihre* Konfiguration heran kommt.

Re: Definition von Funktionen n Python 3.4

Verfasst: Freitag 1. April 2016, 20:28
von pixewakb
Herzlichen Dank! Ich habe es gerade getestet und mir erschließt sich gerade der Sinn!!!

Code: Alles auswählen

import tools.test

tools.test.ausgabe()
"""
def ausgabe():
    print("Test bestanden.")
"""
Ich hatte die Möglichkeit so bislang nicht auf dem Schirm und werde das jetzt mal in einem Fall sinnvoll nutzen können.