dbwebb-se / python

Coursematerial for python
Other
34 stars 33 forks source link

pylint valideringsfel #46

Open AndreasArne opened 3 years ago

AndreasArne commented 3 years ago

Ibland är det svårt att förstå valideringsfelen pylint ger. Här tänkte jag samla förklaringar och exempel. Men det finns väldigt många valideringsfel man kan få och därför tar den kunskapen lång tid att samla och bygga upp.

Andreas förklarar vad ett valideringsfel är och hur man läser dem.

Jag har hittat en webbsida som redan har samlat förklaringar och exempel för de flesta felen, utgå från den i första hand. Dock är vissa exempel och förklaring inte jättebra, om ni hittar ett fel ni inte förstår efter ni har läst om det. Skriv till mig så försöker jag lägga in bättre förklaring och exempel nedanför.

List of errors and solutions.

Hur ni läser ett felmeddelande

Ett valideringsfels uppbyggnad: <fil>:<radnummer>:<columnnummer>: <felkod>: <förklaring av felet> (<felnamn>)

Exempel på ett fel: me/kmom04/marvin3/main.py:30:0: C0116: Missing function or method docstring (missing-function-docstring)

Om du får ett valideringsfel kopiera felkoden eller felnamnet. Sök på det på Google, "List of errors" länken ovanför eller i denna tråden.

AndreasArne commented 3 years ago

Länkar till egna förklaring av fel:

AndreasArne commented 2 years ago

C0123: Using type() instead of isinstance() for a typecheck. (unidiomatic-typecheck) Svar på varför vi ska använda isinstance istället för type:

Skillnaden är egentligen inget vi har nytta av i denna (python) kursen, men är något som är relevant i den objektorienterade kursen efter jul. Efter jul kommer vi att lära oss att skapa egna klasser/datatyper och då kan vi göra en klass som bygger på en annan. Tänk, om vi har en klass som heter Animal och sen skapar vi en klass som heter Dog och Dog bygger/ärver Animal. Om vi då använder type funktionen när vi vill jämföra data typer då kommer vi få False om vi jämför en Dog med en Animal. Men oftast vill vi att det ska blir True, för att Dog bygger på Animal. Numera är rekommenderat att man bara använder sig av isinstance() för att den gör samma sak och mer än vad type() gör.

AndreasArne commented 2 years ago

C0116: Missing function or method docstring (missing-function-docstring) Alla funktioner behöver innehålle en docstring där du förklarar vad koden som funktionen innehåller gör.

def a_func():
    """
    Detta är en docstring som förklarar vad funktionen gör
    """
    pass
AndreasArne commented 2 years ago

R1710: Either all return statements in a function should return an expression, or none of them should. (inconsistent-return-statements)

Är vad den säger, om du har en funktion som innehåller en if-sats med elif och else, och du i något av de if-blocken har en return. Då borde du ha en return i alla if-blocken. Annars bör du skriva om koden så du inte har return i något if-block utan du har en return i slutet av funktionen.

T.ex.

def a_function(in_value):
    if isinstance(in_value, int):
        return in_value * in_value

    if isinstance(in_value, str): 
        return in_value + "hej"

Här har vi ingen return om båda if-satserna blir False. En lösning som typ alltid funkar är att skriva om koden så den bara innehåller en return och den ligger sist i funktionen.

    result = ""
    if isinstance(in_value, int):
        result = in_value * in_value

    if isinstance(in_value, str): 
        result = in_value + "hej"
    return result
AndreasArne commented 1 year ago

R1703 (simplifiable-if-statement)

Exempel på felaktigt kod,

is_true = False

if bar > baz:
    is_true= True
else:
    is_true = False

Vi använder if-satsen för att kolla om något är sant eller falskt. Om det är sant sätter vi en variabel till sant, om det är falskt sätter vi variabeln till falskt. Här behövs inte if-satsen, den är onödig. Det räcker med att bara använda jämförelse operatorn och tilldela vad den returnerar till variabeln.

Rätt lösning

is_true = bar > baz

Raden ovanför gör samma sak som hela if-satsen och är bättre lösning.