2016-04-01 12 views
2

Ich habe einen benutzerdefinierten Modullader, der im Grunde einige Umleitung macht. Ich möchte, dass pylint diesen benutzerdefinierten Loader erkennt. Dies ist meine Situation:Having pylint erkennen benutzerdefinierte Modullader

root/ 
    __init__.py 
    new/ 
     __init__.py 
     foo.py 
     bar.py 
    old/ 
     __init__.py 

ich viele Kunden haben den Import old.foo. Ich schrieb einen kundenspezifischen Lader in old/__init__.py, um diese umzulenken, um new.foo unter der Haube zu importieren. Wie erkenne ich das? Wenn es fickt, beschwert es sich, dass es old.foo nicht finden kann. Dies ist nur ein Problem mit Pyint. Ich kann Client-Code abrufen, um den benutzerdefinierten Ladevorgang ohne jedes Problem zu erkennen.

+1

Ich denke, die [ '__path__'] (https://docs.python.org/3/tutorial/modules.html#packages-in-multiple-directories) besonderen Namen, die Pakete können verwendet werden soll Verwenden Sie, um sich über mehrere Verzeichnisse zu verbreiten, die im Grunde jeden Verweis auf "alt" herum zu "neu" umleiten. –

+0

hilft das überhaupt: [wie man pylint sagt, bestimmte Importe zu ignorieren?] (http://stackoverflow.com/questions/9602811/) how-to-tell-pylint-to-ignore-bestimmte-Importe) –

Antwort

1

vom documentation on modules:

Pakete unterstützen ein weiteres spezielles Attribut, __path__. Dies wird initialisiert, um eine Liste zu sein, die den Namen des Verzeichnisses enthält, in dem sich das Paket __init__.py befindet, bevor der Code in dieser Datei ausgeführt wird. Diese Variable kann geändert werden; Dies beeinflusst zukünftige Suchen nach Modulen und Unterpaketen, die in dem Paket enthalten sind.

Also, wenn ich das richtig verstanden, Sie alle Verweise auf old umleiten wollen new umleiten, so dass alles, was Sie tun würden müssen, ist ersetzen Sie den old Ordner mit old.py, dass diese enthält:

__path__ = ["new"] 

Dann wenn irgendetwas versucht, old.foo zu importieren, wird es am Ende importieren new.foo.

+0

Danke, das ist eine großartige Lösung, um meinen benutzerdefinierten Lader zu ersetzen. Aber Pylint ist immer noch nicht glücklich. Es erkennt '__path__' Änderungen in '__init __. Py' nicht. Erscheint dieses Problem ist unsolvabe, basierend auf http://StackOverflow.com/Q/5394786/1330434 – Srikanth

+0

Ich glaube nicht, dass Sie vollständig verstanden, müssen Sie die __Folder__ durch ein 'old.py ersetzen, wenn das nicht funktioniert arbeite entweder dann bin ich mir nicht sicher was ich vorschlagen soll. –

+0

Versuchte das. Das ändert den Fehler von 'Kein Name' foo 'in Modul' alt '(no-name-in-modul) 'zu' Kann' old.foo '(Importfehler) nicht importieren '. – Srikanth

0

Sie müssen daran denken, dass pylint ein statischer Analysator ist und als solcher nicht wirklich Python-Datei lädt (außer in einigen Fällen, wo es nicht anders geht, z. B. kompilierten Code). Daher ist es nicht bekannt, dass benutzerdefinierte Importer oder andere Tricks Teil der hohen Python-Dynamik sind.

Dass gesagt wird:

  • Sie können nach wie vor ein "Gehirn" Plugin für astroid (die Bibliothek unter Pylint) schreiben, die Pylint Spezifität Ihres Codes

  • unter Berufung auf Standard mecanism verstehen helfen wie zum Beispiel __path__ manipulation wirst du mehr chance haben, solche bedürfnisse zu vermeiden, entweder weil pylint irgendwann das verstehen könnte oder weil jemand anderes ein plugin für diesen zweck beigesteuert hat.