Definiere Variable oder führe return aus in einer Zeile in Abhängikeit von if statement

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
fsg
User
Beiträge: 1
Registriert: Freitag 26. August 2022, 10:06

Ich habe folgendes Beispiel:

Code: Alles auswählen

def checkInt(number):
    if type(number) == int: return number
    return False

def foo():
    x = checkInt(3)
    if not checkInt(3): return
    print(x)
    # do something with x
    
foo()
Ich prüfe für eine Eingabe ob sie eine ganze Zahl ist
-> wenn Ja möchte ich damit weiter arbeiten
-> wenn Nein möchte ich den Prozess abbrechen

Alles funktioniert wie gewünscht, jedoch fände ich es cool, wenn man die Definition von x und den return Befehl in einer Zeile haben könnte... Sowas wie (Achtung keine Pythoncode):

Code: Alles auswählen

x =  checkInt(3) if not checkInt(3) else return
Gibt es da eine Möglichkeit?

Danke für eure HIlfe
Benutzeravatar
kbr
User
Beiträge: 1506
Registriert: Mittwoch 15. Oktober 2008, 09:27

Statt "def checkInt(): ..." reicht ein einfaches

Code: Alles auswählen

isinstance(number, int)
Das Ergebnis ist ein Boolean. In Deinem Beispiel würde number = 0 zu einem mehrdeutigen Ergebnis führen.

Wahlweise Zuweisung oder return geht in einer Zeile nicht – glücklicherweise.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist ziemlich schlecht geloest, weil True und False ebenfalls ints sind - 1 und 0. Sprich: wenn dein checkInt eine 0 bekommt, dann ist der Returnwert trotzdem False. Dein Code also kaputt. Ansich ist Funktionen zu schreiben ja gut, aber an dieser Stelle verkompliziert es das ganze nur: in foo einfach

Code: Alles auswählen

def foo():
    if isinstance(x, int):
         # do something with x
und das war's auch schon.
Benutzeravatar
__blackjack__
User
Beiträge: 14027
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fsg: Warum möchtest Du das? Python ist nicht die Sprache für Leute die unbedingt alles in eine Zeile schreiben wollen. Schon nach dem Doppelpungt bei ``if`` etwas zu schreiben ist falsch. Ja, Python erlaubt das, aber das macht kein Python-Programmierer. Schau mal in den Style Guide for Python Code.

Dein erstes Code-Beispiel sollte von der Formatierung her so aussehen:

Code: Alles auswählen

def check_int(number):
    if type(number) == int:
        return number
    return False


def foo():
    x = check_int(3)
    if not check_int(3):
        return
    print(x)
    # do something with x


foo()
Der Name `number` bei `check_int()` ist irreführend — zu dem Zeitpunkt weiss man ja noch gar nicht ob es sich um eine Zahl handelt.

Wobei man die `check_int()` tatsächlich auch „pythonisch“ in einer Zeile schreiben kann:

Code: Alles auswählen

def check_int(value):
    return value if type(value) == int else False
Eine Typprüfung ist aber auch keine gute Idee. Hier insbesondere weil das ja eine weitere Typprüfung nach sich zieht, denn woran erkennst man sonst ob 0 oder etwas das vom Typ her keine ganze Zahl übergeben wurde? Denn `False` ist auch 0 weil `bool` von `int` abgeleitet ist und `False` gleichzeitig die ganze Zahl 0 ist. (Und `True` die ganze Zahl 1.) Was versuchst Du hier komisches? Typprüfung geht gegen Python's „duck typing“. Und allgemein aus OOP-Sicht ist es auch nicht gut. Es gibt Gründe, aber die sind selten.

In `foo()` wird der `check_int()`-Aufruf unnötig zweimal gemacht.

Code: Alles auswählen

def foo():
    x = check_int(3)
    if not x:
        return
    print(x)
    # do something with x

# oder

def foo():
    x = check_int(3)
    if x:
        print(x)
        # do something with x
Ab Python 3.8 geht auch folgendes:

Code: Alles auswählen

def foo():
    if x := check_int(3):
        print(x)
        # do something with x
Wobei der „Walross-Operator“ ``:=`` bei der Einführung sehr kontrovers war, und man damit die Kompatibilität des Quelltextes auf Python 3.8+ einschränkt.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Schard
User
Beiträge: 16
Registriert: Freitag 25. Dezember 2020, 01:23
Wohnort: Hannover

fsg hat geschrieben: Freitag 26. August 2022, 10:19 Alles funktioniert wie gewünscht
Glaube ich nicht:

Code: Alles auswählen

checkInt(0)
Außerdem verletzt die explizite Forderung der Typgleichheit das Liskovsche Substitutionsprinzip.
Die bereits vorgeschlagene Prüfung mittels isinstance() ist die naheliegende Lösung.
Antworten