Проверка Python 3 Аннотация Синтаксические деревья (ASTS) со статическим типом информации.
Python - это динамически напечатанный язык программирования. Тем не менее, большая часть обычно виденного кода Python будет работать, даже если он был статически напечатать!
С помощью этого пакета можно вставить информацию о статическом типе в Abstract Trees Python Abstract Syntax Trees (ASTS), поэтому предполагая, что заданный код будет работать, если Python будет статически напечатать, можно рассуждать о типах в коде статически, опережая выполнение.
Такой дополненный AST в основном предназначен для анализа/потребления с использованием других инструментов.
Лучше всего работает с AST из модуля typed_ast , однако он также работает со встроенным модулем ast .
Рекомендуйте, что это постоянная работа, и текущая реализация подлежит внезапным изменениям.
Поддержка typed_ast будет отброшена после выпуска Python 3.8, так как его функциональность будет объединен в встроенный анализатор AST.
Содержимое
Вы можете использовать модуль static_typing для непосредственного анализа кода с помощью функции 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' ] Или вы можете увеличить существующую AST, используя функцию 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' ]Для получения дополнительных примеров см. Примеры.
В дополнение к основным функциям, библиотека содержит модуль static_typing.ast_manipulation , который содержит низкоуровневые инструменты и строительные блоки, позволяющие:
typed_ast до встроенного ast и наоборот) и Процесс или статическое типирование, которое реализует функция augment() , имеет 3 основных шага:
Во всех применимых узлах подсказки типов хранятся в полях type_comment , annotation и returns . Type Hint Resolver читает эти поля, которые являются либо необработанными струнами, либо AST.
Он использует предоставленные таблицы символов Python для разрешения подсказки типа в фактические объекты типа с использованием самоанализа.
По умолчанию Resolver использует только встроенные символы, когда называется напрямую или через augment() . Однако при вызове через parse() он использует globals() и locals() абонента по умолчанию.
Решенные подсказки типа хранятся непосредственно в AST. В частности, каждое разрешенное поле хранится в соответственно названном поле, которое либо resolved_type_comment , resolved_annotation или resolved_returns .
Таким образом, информация о статическом типе становится доступной в AST.
Для каждого узла AST, который может содержать любые объявления имени, предоставлена версия узла. Каждый расширенный узел AST имеет новые поля, в которых хранятся эти объявленные имена и типа информации, связанной с каждым именем.
Эти новые поля хранят всю информацию о типах из всех разрешенных подсказок типа в любой локальной области, чтобы можно было обнаружить конфликт типа или отсутствие информации типа. Кроме того, на основе этой комбинированной информации может быть выполнено вывод типа.
В частности, предоставляются новые версии следующих узлов AST с новыми полями: Module , FunctionDef , ClassDef , Assign , AnnAssign , For и With . В этих новых версиях их имена префикс StaticallyTyped...
Список объектов, для которых следует информация в этих новых областях.
Для Module :
Для FunctionDef :
Для ClassDef :
Для Assign и AnnAssign :
For :
Для: With :
Перезапись AST означает замену обычных узлов AST, перечисленных выше, их расширенными версиями.
Python версия 3.5 или более поздней версии.
Библиотеки Python, как указано в требованиях.txt.
Построение и запуск тестов дополнительно требует пакетов, перечисленных в test_requirements.txt.
Протестировано на Linux и Windows.