Я пишу код, который обрабатывает узлы Python AST, который должен быть совместим как для Python 2, так и для Python 3.
Однако, Python 3 имеет ast.Try
, где Python 2 имеет ast.TryFinally
и ast.TryExcept
, поэтому мне нужно использовать псевдонимы visit_
для обработки обоих случаев.
Если я напишу код посетителя узла с использованием псевдонимов совместимости, как показано ниже, моя проверка mypy перед фиксацией будет жаловаться при использовании Python 2, что error: Name 'ast.Try' is not defined
:
import ast
class Visitor(ast.NodeVisitor):
def visit_Try(self, node): # type: (ast.Try) -> None
...
visit_TryFinally = visit_Try # python 2 compatible
Если я вместо этого использую ast.TryFinally
в подсказке типа, он вместо этого будет жаловаться на error: Name 'ast.TryFinally' is not defined
, если я запущу его в Python 3. Я знаю, что могу использовать болееобщий тип для узла, но это заставляет меня писать много кода # type: ignore
в коде, который мне не нужен.
Как я могу решить эту проблему?