2017-10-01 4 views
3

PyCharm donne un avertissement de type lorsque vous travaillez avec la valeur d'un champ MongoEngine. Par exemple, lorsque vous travaillez avec StringField comme avec str:Champs MongoEngine, saisie et PyCharm

class ExampleDocument(Document): 
    s = StringField() 

doc = ExampleDocument(s='mongoengine-test') 
print(doc.s.endswith('test')) 

Je reçois un avertissement référence attribut Unresolved « endswith » pour la classe Stringfield à moins d'utiliser typing.cast (c.-à-typing.cast(str, doc.s).endswith('test') Le code est exécuté comme prévu, mais il est là. de toute façon de se débarrasser de ces avertissements et aussi pour obtenir les autocompletes nécessaires pour les types de champs MongoEngine

Répondre

1

Ce n'est probablement pas la meilleure de toutes les solutions pensables, mais vous pouvez ajouter vos propres indications de type directement aux déclarations de champ. en utilisant la syntaxe 2.7 avec des commentaires (fonctionne également en 3.x):

class ExampleDocument(Document): 
    s = StringField() # type: str 

Ou avec 3.x:

class ExampleDocument(Document): 
    s: str = StringField() 

Utilisation DEFINITIONS type dans les chaînes de doc devraient également travailler:

class ExampleDocument(Document): 
    s = StringField() 
    """:type: str""" 

l'une de ces donne PyCharm (ou Intelij avec des plugins python) les indices nécessaires sur le type à utiliser pour ces champs.

Notez que vous obtiendrez désormais des avertissements lorsque vous accéderez à quelque chose à partir des types de champ mongoengine d'origine, car vous avez effectivement remplacé le type utilisé pour la vérification de type. Si vous voulez PyCharm à reconnaître le mongoengine et le type Python, vous pouvez utiliser un type d'Union:

from typing import Union 
class ExampleDocument(Document): 
    s = StringField() # type: Union[str, StringField] 

Vous trouverez plus de détails sur l'utilisation Hins de type à PyCharm dans les PyCharm docs here.

+0

Merci, c'est plus ou moins ce que j'utilise. Existe-t-il un moyen de déclarer qu'un type en étend un autre (par exemple, que 'StringField' implémente toutes les méthodes de' str')? –

+1

Vous pouvez utiliser 'Union [str, StringField]' dans le commentaire ou les indications de type Python 3.x. L'union doit être importée du module 'typing'. – Markus