Else after return

  • Författare
  • Meddelande

Wim4rk

html-kodare

  • Inlägg: 10
  • Blev medlem: 26 aug 2019, 12:38

Else after return

Inlägg06 okt 2019, 08:21

Pylint gillar inte min kod, och det gör mig ledsen.

Jag förutsätter att "return" avbryter funktionen och skickar tillbaka värdet. Pylint tycker att mitt "else" är onödigt: (else after return).
Varför fungerar det så? "else" pekar väl tillbaks mot if-satsen? Om den inte validerar måste jag väl få lägga in alternativ i en else-sats?

I just det här exemplet kan man helt enkelt ta bort else-satsen och returnera True i slutet av funktionen, men kanske vill jag göra mer ifall att första satsen inte validerar?

Kod: Markera allt
def valid_password(pwd):
    """
    Check if password is valid.
    """
    if (len(pwd) < 8):
        return False
    elif not re.search("[a-z]", pwd):
        return False
    elif not re.search("[A-Z]", pwd):
        return False
    elif not re.search("[0-9]", pwd):
        return False
    else:
        return True

    return ret
Online
Användarvisningsbild

lrc

troubleshooter

  • Inlägg: 405
  • Blev medlem: 11 aug 2016, 21:38
  • Ort: Östersund

Re: Else after return

Inlägg06 okt 2019, 11:15

Om det finns return-satser i samtliga villkorsgrenar av en if-sats blir en avslutande else-sats alltid överflödig, eftersom det enda sätt som exekveringen kan fortsätta efter hela if-strukturen är ifall samtliga villkor är ouppfyllda, då return precis som du säger avbryter funktionen. I övriga fall (utan return) måste man givetvis hantera alla grenar, i och med att exekveringen då bara fortsätter.

Exempel:
Kod: Markera allt
def foo(bar):
  if bar == 1:
    # gren 1
    return "ett"
  elif bar == 2:
    # gren 2
    return "två"
  else:
    # gren 3
    return "annat"

print(foo(1))    # gren 1 exekveras: "ett"
print(foo(2))    # gren 2 exekveras: "två"
print(foo(3))    # gren 3 exekveras: "annat"

Kod: Markera allt
def foo2(bar):
  if bar == 1:
    # gren 1
    return "ett"
  elif bar == 2:
    # gren 2
    return "två"
 
  # standardbeteende när inget villkor är uppfyllt
  return "annat"

print(foo2(1))    # gren 1 exekveras: "ett"
print(foo2(2))    # gren 2 exekveras: "två"
print(foo2(3))    # ingen gren exekveras: "annat"

Som synes påverkar else-satsen inte logiken här, utan utgör enligt lintreglerna endast en onödig syntaktisk konstruktion. Se det som att du först sätter upp villkor för att fånga de fall du är intresserad av att särbehandla och sedan avslutar med att hantera "alla övriga fall" utanför if-konstruktionen. Om du vill "göra mer" är det bara att göra det, oavsett var någonstans koden befinner sig -- det viktiga är att du har koll på det logiska flödet.

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 19 gäster