Augument Python 3 Árboles de sintaxis abstracta (ASTS) con información de tipo estático.
Python es un lenguaje de programación tipado dinámicamente. Sin embargo, gran parte del código de pitón típicamente visto funcionaría incluso si se escribiera estáticamente.
Con este paquete, se puede insertar información de tipo estático en árboles de sintaxis abstractos de Python (ASTS), por lo que suponiendo que el código dado funcionaría si Python se escribiera estáticamente, se puede razonar sobre los tipos en el código estáticamente antes de la ejecución.
Tal AST aumentada está destinada principalmente al análisis/consumo utilizando otras herramientas.
Funciona mejor con ASTS del módulo typed_ast , sin embargo, también funciona con el módulo ast incorporado.
Tenga en cuenta que este es un trabajo continuo, y la implementación actual está sujeta a cambios repentinos.
El soporte de typed_ast se eliminará después de que se lance Python 3.8, ya que su funcionalidad se fusionará en el analizador AST incorporado.
Contenido
Puede usar el módulo static_typing para analizar el código directamente usando la función parse() :
import static_typing as st
class MyClass :
pass
module = st . parse ( 'def my_fun(obj: MyClass) -> MyClass: return obj' )
# TODO: currently there is no public API yet
functions = module . _functions
my_fun = module . _functions [ 'my_fun' ]
assert MyClass in my_fun . _params [ 'obj' ] O puede aumentar la función AST existente usando augment() :
import static_typing as st
import typed_ast . ast3
module = typed_ast . ast3 . parse ( '''def spam(): x, y, z = 'ham', 42, 3.1415 # type: str, int, float''' )
module = st . augment ( module )
# TODO: currently there is no public API yet
function = module . _functions [ 'spam' ]
assert len ( function . _local_vars ) == 3
assert float in function . _local_vars [ 'z' ]Para más ejemplos, consulte Ejemplos.ipynb cuaderno.
Además de las características principales, la biblioteca contiene módulo static_typing.ast_manipulation que contiene herramientas de bajo nivel y bloques de construcción que permiten:
typed_ast a ast y viceversa incorporado) y El proceso o la tipificación estática, que implementa la función augment() tiene 3 pasos principales:
En todos los nodos aplicables, los sugerencias de tipo se almacenan en campos type_comment , annotation y returns . El tipo de indicio de sugerencias lee esos campos, que las cosas son cadenas crudas o ASTS.
Utiliza tablas de símbolos Python proporcionadas para resolver sugerencias de tipo en objetos de tipo real usando la introspección.
Por defecto, el resolución usa solo símbolos incorporados cuando se les llama directamente o a través de augment() . Sin embargo, cuando se llama a través de parse() usa globals() y locals() de la persona que llama por defecto.
Los sugerencias de tipo resuelto se almacenan directamente en el AST. Específicamente, cada campo resuelto se almacena en un campo llamado correspondientemente, que se resolved_type_comment , resolved_annotation o resolved_returns .
Por lo tanto, la información de tipo estático está disponible en el AST.
Para cada nodo AST que podría contener cualquier declaración de nombre, se proporciona una versión exetendida de un nodo. Cada nodo AST extendido tiene nuevos campos que almacenan los nombres declarados y el tipo de información asociada con cada nombre.
Estos nuevos campos almacenan toda la información de tipo de todos los tipos resueltos sugerencias dentro de cualquier alcance local, de modo que se pueda detectar un conflicto de tipo o falta de información de tipo. Además, según esta información combinada, se puede realizar una inferencia de tipo.
Específicamente, se proporcionan nuevas versiones de los siguientes nodos AST con nuevos campos: Module , FunctionDef , ClassDef , Assign , AnnAssign , For y With . Esas nuevas versiones tienen sus nombres prefijados StaticallyTyped...
Sigue una lista de entidades para las cuales se recopila información en esos nuevos campos.
Para Module :
Para FunctionDef :
Para ClassDef :
Para Assign y AnnAssign :
Para For :
Para With :
La reescritura AST significa reemplazar los nodos AST ordinarios enumerados anteriormente con sus versiones extendidas.
Python versión 3.5 o posterior.
Bibliotecas de Python como se especifica en requisitos.txt.
Las pruebas de construcción y ejecución también requieren paquetes enumerados en test_requirements.txt.
Probado en Linux y Windows.