Pylint Python 3

  • pylint --version

    pylint 2.4.4

    astroid 2.3.3

    Python 3.8.10 (default, Jun 22 2022, 20:18:18)

    [GCC 9.4.0]


    wenn ich das richtig verstehe, dann muesste doch pylint fuer python 3 checken.

    d.h. das plugin wuerde auf python 3 laufen.

    interessanterweise laeuft es gerade auf python 2.7.

    also keine aenderungen notwendig?

  • Die Wahrscheinlichkeit, dass z.B. imports angepasst werden müssen ist sehr hoch. Kannst ja mal mit lib2to3 checken.

    Gruss
    Dre


    Boxen (im Einsatz): DM920, DM900, DMOne
    Developer Project Merlin - we are OpenSource

  • Hm, also hab nur kurz reingeschaut und schon die Imports können in Python3 nicht funktionieren (die müssen nämlich jetzt absolut oder relativ angegeben werden)


    also z.B.


    from MediaInfo import MediaInfo


    muss jetzt


    from .MediaInfo import MediaInfo


    lauten


    Damit das wiederum funktioniert müsstest du


    from __future__ import absolute_import


    im Code ganz oben eintragen.


    Auch überall wo irgendwo Strings konvertiert werden wird man Hand anlegen müssen.


    Vorzugsweise baut man den Code natürlich so um das er sowohl mit Python3 als auch Python 2.7 läuft (daher brauchst du future und/oder six)


    Ich hab aktuell im MP hunderte Stellen geändert und es ist noch nicht 100% kompatibel mit Python3 (aufgrund fehlender Testmöglichkeiten)

  • ja, das mit dem . hat das tool auch gemeldet... aber ich dachte, das sei jacke wie hose :winking_face:

    ansonsten nur ein paar wenige sachen... aber vielleicht taugt das tool auch nicht viel.

    na gut, man wird sehen, wenn python3 verfuegbar ist.

  • from __future__ import absolute_import

    Ist das wirklich nötig?

    Ich mache es auch ohne, mein Code funktioniert für py2 und py3.


    from .MediaInfo import MediaInfo

    ja genau, geht für py2 und py3

    Auch überall wo irgendwo Strings konvertiert werden wird man Hand anlegen müssen.

    Hier nutze ich das, da ich bei Emby ja json nutze:

    Code
    def getTxt(value):
        if sys.version_info > (3, 0):
            return str(value)
        else:
            try:
                value = value.encode("utf-8")
            except Exception as error:
                value = str(value)
        return value

    Bei setList ist list(map wichtig sonst ist die Liste Leer.

    Code
    self.chooseDataList.setList(list(map(get_list_entry_data, self.data)))

    Imports muss man dann auch anpassen, da manche Imports bei py3 anders sind:

    Python
    try:
        from urllib.parse import urlparse
    except ImportError as error:
        from urlparse import urlparse

    Und wenn man "print" nutzt muss man es in Klammern setzen also so print("bla") funktioniert für py2 und py3.


    Auch kann man bei Json kein iteritems() nutzen, hier dann einfach nur items() nutzen.


    Aus

    Code
    except Exception, e:

    wird dann

    Code
    except Exception as e:


    Das sind ein paar Punkte die man beachten muss.

  • Nein das mit urllib ist auch unnötig dafür gibt es eine Kompatibilitätsschicht.


    Man nutzt dann nur noch Python3 Code auch für Python2


    from future import standard_library

    standard_library.install_aliases()


    Von exzessiver Nutzung von try except halte ich gar nichts.


    Übrigens fall du das mit absolute_imports anzweifelst da gibt's ein paar Sachen die schon in 2.7 gingen aber nicht alles, daher muss man das eigentlich von future importieren.

    Wenn es bei dir bisher ging gut :smiling_face:

    Einmal editiert, zuletzt von dhwz () aus folgendem Grund: Ein Beitrag von dhwz mit diesem Beitrag zusammengefügt.

  • Übrigens fall du das mit absolute_imports anzweifelst da gibt's ein paar Sachen die schon in 2.7 gingen aber nicht alles, daher muss man das eigentlich von future importieren.

    Anzweifeln nicht, aber mein Versuch damit hat nicht funktioniert.


    Von exzessiver Nutzung von try except halte ich gar nichts.

    Kann gut sein bin nicht vom Fach, daher erleichtert es mir so einiges.

  • hab jetzt mal ein kleines testprogramm geschrieben, um das mit dem . import zu testen:


    test.py

    Python
    #!/usr/bin/python
    from te import huhu
    
    print(huhu())

    te.py

    Python
    #!/usr/bin/python
    
    def huhu():
            return 123

    mit python3 funktioniert das ohne . problemlos... oder verstehe ich da was falsch?

  • Kann gut sein bin nicht vom Fach, daher erleichtert es mir so einiges.

    Das ist ja auch ok ich wollte nur damit sagen es gibt schönere Wege ohne dass man den Code mit vielen try except zu ballert.

    Wie gesagt ich kann diese Kompatibilitätsschichten von future/six nur wärmstens empfehlen wenn der Code py2/3 tauglich sein soll.

    Im Prinzip schreibt man dann schon großenteils reinen Python3 Code nur das er auch mit Python2.7 läuft.

  • hab jetzt mal ein kleines testprogramm geschrieben, um das mit dem . import zu testen:


    test.py

    Python
    #!/usr/bin/python
    from te import huhu
    
    print(huhu())

    te.py

    Python
    #!/usr/bin/python
    
    def huhu():
            return 123

    mit python3 funktioniert das ohne . problemlos... oder verstehe ich da was falsch?

    ja, da hatte ich was falsch verstanden... also bei modulen mit __init__.py braucht man den . fuer ein relative import.

    den . punkt gibts uebrigens schon seit python 2.4... deswegen funktioniert der by murxer ohne :winking_face:

  • Der import den ich gepostet hatte fixt ja auch absolute Imports die nicht mehr gehen :winking_face:

    Ich hab das wohl etwas zu kurz gefasst in meiner Antwort.

    Relative Imports gingen auch früher schon, aber wie du schon erkannt hast z.B. für init benötigt man nun einen .

    Es schadet aber wirklich nicht das generell zu verwenden

    Weil man halt auch schön aus tieferen Verzeichnissen importieren kann z.B. from ...foobar import x

    Früher hätte da vermutlich jeder von uns absolute Imports verwendet.

    Einmal editiert, zuletzt von dhwz ()

  • so, alle 2to3 recommendations sind bipythonal implementiert... was nicht direkt ging, habe ich mit der six library hingebogen :grinning_face_with_smiling_eyes:

    am meisten arbeit waren die vielen punkte fuer die relativen imports und das neue sortieren der imports, damit pylint zufrieden ist.

    ich kann das 2to3 tool nur empfehlen. bin gespannt, was noch zusaetzlich notwendig wird, wenn python3 mal kommt..