Seite 1 von 1

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

Verfasst: Freitag 26. August 2022, 10:19
von fsg
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

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

Verfasst: Freitag 26. August 2022, 11:55
von kbr
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.

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

Verfasst: Freitag 26. August 2022, 11:56
von __deets__
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.

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

Verfasst: Freitag 26. August 2022, 12:04
von __blackjack__
@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.

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

Verfasst: Samstag 27. August 2022, 13:57
von Schard
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.