Seite 1 von 1
Grundlegende Frage zur Verwendung eigener Module
Verfasst: Dienstag 15. Oktober 2019, 20:32
von U32
Hallo Kollegen!
Ich bin - was Python angeht - noch ein ziemlicher Rookie...
Daher möchte ich die Verwendung von Modulen ein wenig üben.
Ich habe mir dazu ein Modul (MOD_Zeitstempel.py) und ein Hauptprogramm (Hauptprogramm.py) erstellt.
Das Modul sieht so aus:
Code: Alles auswählen
import time
Test = time.strftime("%d.%m.%Y")
def Datum ():
Datum = time.strftime("%d.%m.%Y")
return(Datum)
def Uhrzeit():
Uhrzeit = time.strftime("%H:%M:%S")
return(Uhrzeit)
#Das hier dient nur zur Kontrolle und hat nicht mit dem eigentlichen Script zu tun.
print()
print(Test)
print(Datum)
print(Uhrzeit)
print()
print('Ende')
Das Hauptprogramm sieht so aus:
Code: Alles auswählen
from MOD_Zeitstempel import Datum, Uhrzeit
print()
print('Datum:', Datum)
print('Uhrzeit:', Uhrzeit)
print()
wenn ich beides nun teste bekomme ich für die Werte Datum und Uhrzeit nur
<function Datum at 0x00F814F8>
bzw.
<function Uhrzeit at 0x00F81588>
angezeigt.
Die Variable "Test" hingegen, wird korrekt angezeigt.
Kann mir da bitte jemand weiterhelfen?
Bin mir sicher, es ist ein grober Anfängerfehler, aber ich finde ihn einfach nicht.
Vielen Dank vorab und beste Grüße
U32
Re: Grundlegende Frage zur Verwendung eigener Module
Verfasst: Dienstag 15. Oktober 2019, 20:49
von __deets__
Du musst deine Funktionen aufrufen. Also Datum().
Und bitte mach dich mit den Namenskonventionen in PEP8 vertraut. Module zb werden komplett klein geschrieben (so muss natürlich dann auch der Dateiname sein), und so etwas wie “mod_” als Prefix macht man nicht. Es ist importiert. Was soll es sonst sein?
Re: Grundlegende Frage zur Verwendung eigener Module
Verfasst: Mittwoch 16. Oktober 2019, 07:12
von Sirius3
@U32: zum Üben: Funktionsnamen sollten Tätigkeiten ausdrücken, Datum und Uhrzeit sind das nicht. `ermittle_aktuelle_uhrzeit` ist dagegen viel aussagekräftiger. So wie Du das programmiert hast, ist das übrigens verwirrend. Es wird ein Datum und eine Uhrzeit ausgegeben, die nichts miteinander zu tun haben. Bei mir ist es der 15.10.2019 um 00:00:00, also knapp 24 Stunden daneben.
Wenn Du mit Datum und Uhrzeit arbeiten willst, benutze das Datetime-Modul, ermittle einmal die aktuelle Zeit und gib das in einem zweiten Schritt aus.
Re: Grundlegende Frage zur Verwendung eigener Module
Verfasst: Mittwoch 16. Oktober 2019, 10:27
von U32
Hallo zusammen!
Zunächst einmal vielen Dank für die schnellen Antworten!
@Sirius3:
Oh, vielen Dank für den Hinweis. Werde ich zukünftig beherzigen.
Das mit dem Datum und der Uhrzeit macht nicht wirklich Sinn, ich weiß, aber mir fiel zum testen nichts besseres ein.
Mir geht es ja hauptsächlich um den Austausch von Daten zwischen Haupt- und "Unterprogramm".
@__deets__:
Wie schon erwähnt, werde ich die Namenskonvention zukünftig einhalten.
Was das Aufrufen der Funktion angeht, klingt das selbst für einen Laien logisch - wie peinlich!
Egal von wo ich die Funktion aber nun aufrufe (im Hauptprogramm, oder im Modul), es ändert aber nichts an dem finalen Wert der Variablen.
Im Folgenden habe ich die Funktionen innerhalb des Moduls aufgerufen.
Modul:
Code: Alles auswählen
import time
Test = time.strftime("%d.%m.%Y %H:%M:%S")
print()
print(Test)
def Datum ():
Datum = time.strftime("%d.%m.%Y")
print()
print(Datum)
return(Datum)
def Uhrzeit ():
Uhrzeit = time.strftime("%H:%M:%S")
print(Uhrzeit)
return(Uhrzeit)
Datum()
Uhrzeit()
#Das hier dient nur zur Kontrolle und hat nicht mit dem eigentlichen Script zu tun.
print()
print(Datum)
print(Uhrzeit)
print()
print('Ende')
Ausgabe:
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 19:29:22) [MSC v.1916 32 bit (Intel)] auf PC01, Standard
[<default>]
>>>
16.10.2019 10:19:00 <= Ausgabe "Referenzvariable"
16.10.2019 <= Ausgabe der Variablen innerhalb der Funktion
10:19:04
<function Datum at 0x02FF14F8> <= Ausgabe der Variablen außerhalb der Funktíon
<function Uhrzeit at 0x02FF1588>
Ende
Wenn der Inhalt der Variablen im Modul schon falsch ist, wird er ja auch falsch ins Hauptprogramm übernommen.
Müsste nicht bei der zweiten Ausgabe auch das Datum und die Uhrzeit korrekt dargestellt werden (so wie innerhalb der Funktion)?
Ich verstehe nur nicht, was ich falsch mache...
Noch eine Idee???
Vielen Dank und beste Grüße
U32
Re: Grundlegende Frage zur Verwendung eigener Module
Verfasst: Mittwoch 16. Oktober 2019, 10:40
von __blackjack__
@U32: Ich würde sagen Du machst genau den gleichen Fehler wieder. Du gibst die Funktion selbst aus – das ist auch ein Wert/Objekt – und nicht den Rückgabewert der Funktion. Um an den Rückgabewert der Funktion zu kommen muss man sie *aufrufen*.
Was hier auch reichlich verwirrend ist, und darum gibt es ja die Konvention Funktionen nach Tätigkeiten und nicht nach ”Dingen” zu benennen, ist das Du sowohl in der Funktion `Datum` als auch in der Funktion `Uhrzeit` jeweils den Namen `Datum` und `Uhrzeit` lokal noch mal für etwas anderes verwendest. Nämlich eine Zeichenkette.
Und wenn Du es richtig schreiben würdest, also mit Aufruf :``print(Datum())``, dann wird das Datum natürlich zweimal ausgegeben. Einmal durch das `print()` innerhalb der Funktion, und dann durch das `print()` das den Rückgabewert ausgibt.
Re: Grundlegende Frage zur Verwendung eigener Module
Verfasst: Mittwoch 16. Oktober 2019, 10:54
von U32
@__blackjack__:
Aaah! Jetzt hab' ich's verstanden.
Kaum macht man's richtig... schon funktionierts!
Vielen Dank euch allen!
Re: Grundlegende Frage zur Verwendung eigener Module
Verfasst: Mittwoch 16. Oktober 2019, 11:02
von Sirius3
@U32: jede Funktion hat ihren eigenen Namensraum, das heißt, Variablennamen die innerhalb einer Funktion belegt werden, sind lokal nur innerhalb dieser Funktion erreichbar. Die Namen Deiner Funktionen im Modul-Namensraum werden dadurch nicht berührt. Das ist gut so, denn sonst müßte man sich bei jedem Variablennamen überlegen, ob der nicht schon irgendwo anders im Programm auch verwendet wurde. Du hast also nur lokale Variablen, die auch nicht vom Modul ins Hauptmodul übernommen werden, sondern die halt nur innerhalb der Funktionen existieren.
Re: Grundlegende Frage zur Verwendung eigener Module
Verfasst: Mittwoch 16. Oktober 2019, 11:07
von U32
Falls jemand das gleiche Problem hat, hier nochmal der korrigierte (und nun funktionierende) Code:
Das Modul (zeitstempel.py):
Code: Alles auswählen
import time
def datum_ermitteln ():
Datum = time.strftime("%d.%m.%Y")
return(Datum)
def uhrzeit_ermitteln ():
Uhrzeit = time.strftime("%H:%M:%S")
return(Uhrzeit)
Das Hauptprogramm (Hauptprogramm.py):
Code: Alles auswählen
from zeitstempel import datum_ermitteln, uhrzeit_ermitteln
print()
print('Datum:', datum_ermitteln())
print('Uhrzeit:', uhrzeit_ermitteln())
Vielen Dank nochmal für die Hilfe und beste Grüße
U32
Re: Grundlegende Frage zur Verwendung eigener Module
Verfasst: Mittwoch 16. Oktober 2019, 11:54
von __blackjack__
``return`` ist keine Funktion, das sollte man also auch nicht so schreiben das es wie ein Funktionsaufruf aussieht. Und man muss nicht jeden Wert an einen Namen binden wenn das keinen Vorteil für den Leser bietet.
Code: Alles auswählen
import time
def datum_ermitteln():
return time.strftime("%d.%m.%Y")
def uhrzeit_ermitteln():
return time.strftime("%H:%M:%S")
Edit: Oder:
Code: Alles auswählen
from functools import partial
import time
datum_ermitteln = partial(time.strftime, "%d.%m.%Y")
uhrzeit_ermitteln = partial(time.strftime, "%H:%M:%S")