2017-06-26 4 views
1

J'ai un code source Python, et je veux connaître le type d'une variable. Par exemple étant donné la chaîneObtenir les types dans l'expression Python en utilisant MyPy comme bibliothèque

""" 
greeting = "Hello" 
""" 

Je veux avoir get_type('greeting') == str. Ou un exemple plus complexe:

""" 
def test(input: str): 
    output = len(input) 
    return str 
""" 

En pseudocode, je veux être capable de faire quelque chose comme:

>>> m = parse_module() 
>>> m.functions['test'].locals['output'].get_type() 
int 

Il semble que cela devrait être possible avec des annotations de type et MyPy en Python 3, mais je ne peut pas comprendre comment. Les IDE comme le code VS sont devenus très bons pour deviner les types dans le code python, c'est pourquoi je suppose qu'il doit y avoir une manière exposée de le faire.

Il semble y avoir un module typed-ast, qui est également utilisé par MyPy, qui me fait partie du chemin. Cependant, cela ne fait aucune inférence de type ou de propagation, il me donne juste les annotations explicites autant que je comprends. MyPy en tant qu'api, mais il ne vous permet que d'exécuter le vérificateur et renvoie les mêmes messages d'erreur que l'outil de ligne de commande. Je suis à la recherche d'un moyen de «pénétrer» dans MyPy, et obtenir une partie de l'information inférée - ou une autre solution à laquelle je n'ai pas pensé.

+0

Vous pourriez utiliser le module 'inspect'. C'est un assistant d'introspection Python. –

+0

Im confus pouvez-vous pas simplement utiliser la fonction 'type()'? – Joe

+0

J'ai le code comme une chaîne, et je ne veux pas l'exécuter. Je veux obtenir les types de variables contenues dans le code source. – jdm

Répondre

2

Mypy possède actuellement une API extrêmement primitive, à base d'os, que vous pouvez trouver «documentée» dans le code source ici: https://github.com/python/mypy/blob/master/mypy/api.py. Pour l'utiliser, vous devez essentiellement écrire votre chaîne dans un fichier temporaire que vous nettoyez plus tard.

Vous pouvez peut-être combiner ceci avec la directive spéciale reveal_type(...) (et peut-être même l'option hidden --shadow-file) pour typecheck votre chaîne.

L'autre alternative est de désosser et de réimplanter des pièces de mypy's main.py, en détournant essentiellement leur API interne. Je ne pense pas que ce sera difficile, juste un peu moche et fragile. (Notez que mypy peut théoriquement supporter des vérifications arbitraires, et les développeurs principaux ne sont pas opposés à l'extension de l'API pour mypy en principe - c'est juste que mypy est encore en développement actif ce qui signifie que l'implémentation d'une API a été très Et puisque mypy est encore activement travaillé/étendu, les développeurs sont quelque peu réticents à s'engager à implémenter une API plus complexe qu'ils devront ensuite supporter.Vous pouvez trouver plus de contexte et de détails concernant le état actuel de l'API dans le suiveur d'anomalies de mypy.)