Python 3.8+astпонятие
ast.FunctionType
корень и базовые узлы
Корень для mode='func_type': разбирает старый комментарий типов функции вида '(int, str) -> bool' на argtypes и returns.
Синтаксис
ast.parse('(argtypes) -> returns', mode='func_type') # → ast.FunctionType
Узел нужен инструментам вроде mypy, которые читают комментарии '# type: (int) -> str' из кода, написанного до аннотаций. Сам ast.parse такие комментарии из исходника не достаёт: нужен type_comments=True, после чего строка лежит в поле type_comment у FunctionDef, и её приходится отдельно разобрать в режиме 'func_type'. Ни выполнить, ни скомпилировать такое дерево нельзя.
Примеры
import ast
ft = ast.parse('(int, str) -> bool', mode='func_type')
print(type(ft).__name__) # → FunctionType
print([a.id for a in ft.argtypes], ft.returns.id) # → ['int', 'str'] bool
import ast
src = 'def f(a):\n # type: (int) -> str\n return str(a)'
fn = ast.parse(src, type_comments=True).body[0]
print(fn.type_comment) # → (int) -> str
print(ast.parse(fn.type_comment, mode='func_type').returns.id) # → str
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности