Grundlegende Frage zur Verwendung eigener Module

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
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

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! :oops:

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
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

@__blackjack__:
Aaah! Jetzt hab' ich's verstanden.
Kaum macht man's richtig... schon funktionierts!

Vielen Dank euch allen!
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
U32
User
Beiträge: 25
Registriert: Sonntag 6. Oktober 2019, 13:34

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
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

``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")
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten