ubuntuusers.de

[python] pylint false positive?

Status: Gelöst | Ubuntu-Version: Ubuntu
Antworten |

Werzi2001

Anmeldungsdatum:
18. November 2006

Beiträge: 420

Hi@ll

ich habe ein Array in dem ich "Funktionszeiger" speichere. Diese Funktionen rufe ich dann (einzeln) auf und sichere deren Rückgabewert in einer Variable. Wenn der Rückgabewert vom Typ String ist und er nur Zahlen enthält caste ich ihn in einen int-Typ. Der Code sieht so aus:

value = _FUNCTIONS[funcname](parameters)
    if isinstance(value, str):
        if value.isdigit():
            value = int(value)

IMHO gibt es an dem Code nichts auszusetzen und er funktioniert auch einwandfrei. Allerdings bringt pylint folgenden Fehler:
Instance of 'int' has no 'isdigit' member

Ist das ein false positive oder mache ich wirklich etwas falsch?

Danke für eure Hilfe ☺

mfg
Thomas W

blackbird Team-Icon

Avatar von blackbird

Anmeldungsdatum:
19. November 2004

Beiträge: 3397

Wohnort: Hermagor, Kärnten - Österreich

Das ist ganz einfach. Pylint bindet Namen lokal zu Typen. Weil du str: value = int(value) machst und damit den datentyp änderst kommt pylint nicht wirklich mit. Einfach ignorieren oder ein pylint kommentar setzen.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Werzi2001 hat geschrieben:

Hi@ll

ich habe ein Array in dem ich "Funktionszeiger" speichere. Diese Funktionen rufe ich dann (einzeln) auf und sichere deren Rückgabewert in einer Variable. Wenn der Rückgabewert vom Typ String ist und er nur Zahlen enthält caste ich ihn in einen int-Typ. Der Code sieht so aus:

value = _FUNCTIONS[funcname](parameters)
    if isinstance(value, str):
        if value.isdigit():
            value = int(value)

IMHO gibt es an dem Code nichts auszusetzen und er funktioniert auch einwandfrei. Allerdings bringt pylint folgenden Fehler:
Instance of 'int' has no 'isdigit' member

Ist das ein false positive oder mache ich wirklich etwas falsch?

Bei Python stellt sich das Problem, dass aufgrund der dynamischen Typisierung nicht immer genau Typinformationen ermittelt werden können, speziell dann, wenn man Funktionen dynamisch ermittelt und nicht über ihren eigentlichen Namen aufruft. Zudem sollte die Typüberprüfung in der if Abfrage verhindern, dass isdigit für Integer-Werte aufgerufen wird. Ich denke, in diesem Fall kannst du von einem False Positive ausgehen. Wobei man vielleicht hinzufügen sollte, dass du eventuell dein Design überdenken könntest. Wenn pylint nicht in der Lage ist, den Typ korrekt zu bestimmen, dann bist du es vielleicht später auch nicht mehr. Das könnte zu Fehlern führen...

Btw, lieber ein "if isinstance(value, basestring)". Damit schließt du unicode Strings mit ein...

Werzi2001

(Themenstarter)

Anmeldungsdatum:
18. November 2006

Beiträge: 420

Hi,

danke für eure Antworten ☺
Dachte mit schon, dass es ein False Positive ist, da ich ja explicit dafür sorge, dass es nur für Strings ausgeführt wird. Leider lässt sich das nicht vermeiden, da diese Funktionen ALLES zurückgeben können... ist eine lange Geschichte 😉

mfg
Thomas W

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

blackbird hat geschrieben:

Einfach ignorieren oder ein pylint kommentar setzen.

Was ist den ein pylint-Kommentar? Ich verwende pylint zwar schon einige Zeit, aber das ist mir noch nicht untergekommen ...

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4673

Wohnort: Berlin

Man kann einzelne Warnungen für Codeblöcke ein- oder ausschalten:

# pylint: disable-msg=W0401, E0202
# pylint: enable-msg=C0302

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Marc 'BlackJack' Rintsch hat geschrieben:

Man kann einzelne Warnungen für Codeblöcke ein- oder ausschalten:

# pylint: disable-msg=W0401, E0202
# pylint: enable-msg=C0302

Cool! 😉 Endlich kann ich mal den ganzen Mist deaktivieren, denn pylint mir immer ausgibt 😉

Ich gehe mal davon aus, dass die Codeblöcke sich dann auf die Einrückung beziehen, oder?

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4673

Wohnort: Berlin

Jup das bezieht sich auf Einrückung. Den ganzen Mist kannst Du aber einfacher in der Konfigurationsdatei abstellen. 😉

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Marc 'BlackJack' Rintsch hat geschrieben:

Jup das bezieht sich auf Einrückung. Den ganzen Mist kannst Du aber einfacher in der Konfigurationsdatei abstellen. 😉

Stimmt, aber dann ist es Datei-übergreifend. Bestimmte pylint Warnungen möchte ich nur bei ganz bestimmten Dateien ausschalten. Ein Beispiel wären distutils-Erweiterungen. Da meckerte pylint, dass die Variablen, die die Werte von Kommandozeilen Optionen aufnehmen, immer außerhabl von __init__ definiert werden. Die distutils werden aber nun mal initialize_options und finalize_options, um die Attribute zu definieren und zu füllen. Für distutils Skripte möchte ich die Warnungen also ausschalten, aber bei anderen Code-Stückchen achte ich schon darauf, dass möglichst alle Attribute in __init__ definiert werden.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4673

Wohnort: Berlin

Das Problem kannst Du aber auch ein für alle mal in einer globalen Konfigurationsdatei lösen. Die beiden Methodennamen einfach zu dieser Option hinzufügen (Aussschnitt aus pylint --help):

    --defining-attr-methods=<method names>
                        List of method names used to declare (i.e. assign)
                        instance attributes. [current: __init__,__new__,setUp]

Der Nachteil, dass man dann auch ausserhalb von distutils-Code die beiden Methoden zum setzen von Attributen ohne Warnung benutzen kann, ist IMHO nicht so gross. Sofern man es überhaupt als Nachteil sieht.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Marc 'BlackJack' Rintsch hat geschrieben:

Das Problem kannst Du aber auch ein für alle mal in einer globalen Konfigurationsdatei lösen. Die beiden Methodennamen einfach zu dieser Option hinzufügen (Aussschnitt aus pylint --help):

    --defining-attr-methods=<method names>
                        List of method names used to declare (i.e. assign)
                        instance attributes. [current: __init__,__new__,setUp]

Der Nachteil, dass man dann auch ausserhalb von distutils-Code die beiden Methoden zum setzen von Attributen ohne Warnung benutzen kann, ist IMHO nicht so gross. Sofern man es überhaupt als Nachteil sieht.

Cool! 😀 Dann steht der vollen Punktzahl ja nichts mehr im Weg 😉

Antworten |