7 votes

VS Code PyLint Error E0602 (undefined variable) with ProtoBuf compiled Python Structure

J'ai longtemps utilisé Visual Studio, mais il devenait trop compliqué à maintenir. Maintenant, j'ai essayé de passer à VS Code, mais il envoie un certain nombre de messages d'erreur PyLint qui n'ont aucun sens pour moi (et le programme fonctionne toujours comme prévu). Ces erreurs se produisent principalement avec le code Python généré à partir d'une structure GoogleProtoBuf.

Par exemple :

from lbsnstructure.lbsnstructure_pb2 import lbsnPost

def geoaccuracy_within_threshold(post_geoaccuracy, min_geoaccuracy):
    """Checks if geoaccuracy is within or below threshhold defined"""

    if min_geoaccuracy == lbsnPost.LATLNG:
        allowed_geoaccuracies = [lbsnPost.LATLNG]
    elif min_geoaccuracy == lbsnPost.PLACE:
        allowed_geoaccuracies = [lbsnPost.LATLNG, lbsnPost.PLACE]
    elif min_geoaccuracy == lbsnPost.CITY:
        allowed_geoaccuracies = [lbsnPost.LATLNG, lbsnPost.PLACE, lbsnPost.CITY]
    else:
        return True
    # check post geoaccuracy
    if post_geoaccuracy in allowed_geoaccuracies:
        return True
    else:
        return False

Lance le message d'erreur E0602 de pyLint :

Variable indéfinie 'lbsnPost' pylint (E0602)
lbsnPost : GeneratedProtocolMessageType

Cependant, Google indique explicitement que cette forme de référencement de type est correcte :

Les enums sont développés par la métaclasse en un ensemble de constantes symboliques avec des valeurs entières. Ainsi, par exemple, la constante addressbook_pb2.Person.WORK a la valeur 2.

J'obtiens des erreurs similaires partout dans mon code (qui fonctionne bien). Je soupçonne qu'il s'agit de quelque chose que j'ai écrit dans la mauvaise convention, mais qui fonctionne quand même. Mais quelle est la bonne convention ?

Screenshot VSCode Pylint Error E0602

Cette page semble traiter du même problème, mais aucune des solutions proposées ne fonctionne :
Variable indéfinie de l'importation lors de l'utilisation de tampons de protocole dans PyDev
c'est-à-dire, même en faisant lbsnpost().LATLNG (instanciation du message protobuf), j'obtiens la même erreur de variable non définie.

13voto

Alex Points 335

J'ai résolu mon problème. Apparemment pylint a (avait ?) des problèmes avec les classes python compilées par protobuf. Il y a un paquet disponible sur qui résout ce problème.

  • installé pylint-protobuf paquet ( pip install pylint-protobuf )
  • ajouté "python.linting.pylintArgs": ["--load-plugins", "pylint_protobuf"] aux paramètres de l'utilisateur dans le code VS

Aucune erreur !

Pour plus d'informations, voir le Docs sur le linting du code VS

0voto

Vérifier settings.json dans le dossier .vscode Je travaille dans virtualenv mais le chemin de la source python est le chemin local. Changez le chemin de python pour virtualenv. Cela fonctionne pour moi. Pour connaître le chemin, écrire "which python3" dans le terminal avec le VE activé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X