| 50 | |
| 51 | # a greatly cut-down version of `ast._Unparser` |
| 52 | class _UnparseVisitor(ast.NodeVisitor): |
| 53 | def __init__(self, code: str = '') -> None: |
| 54 | self.code = code |
| 55 | |
| 56 | def _visit_op(self, node: ast.AST) -> str: |
| 57 | return OPERATORS[node.__class__] |
| 58 | |
| 59 | for _op in OPERATORS: |
| 60 | locals()[f'visit_{_op.__name__}'] = _visit_op |
| 61 | |
| 62 | def visit_arg(self, node: ast.arg) -> str: |
| 63 | if node.annotation: |
| 64 | return f'{node.arg}: {self.visit(node.annotation)}' |
| 65 | else: |
| 66 | return node.arg |
| 67 | |
| 68 | def _visit_arg_with_default(self, arg: ast.arg, default: ast.AST | None) -> str: |
| 69 | """Unparse a single argument to a string.""" |
| 70 | name = self.visit(arg) |
| 71 | if default: |
| 72 | if arg.annotation: |
| 73 | name += ' = %s' % self.visit(default) |
| 74 | else: |
| 75 | name += '=%s' % self.visit(default) |
| 76 | return name |
| 77 | |
| 78 | def visit_arguments(self, node: ast.arguments) -> str: |
| 79 | defaults: list[ast.expr | None] = list(node.defaults) |
| 80 | positionals = len(node.args) |
| 81 | posonlyargs = len(node.posonlyargs) |
| 82 | positionals += posonlyargs |
| 83 | for _ in range(len(defaults), positionals): |
| 84 | defaults.insert(0, None) |
| 85 | |
| 86 | kw_defaults: list[ast.expr | None] = list(node.kw_defaults) |
| 87 | for _ in range(len(kw_defaults), len(node.kwonlyargs)): |
| 88 | kw_defaults.insert(0, None) |
| 89 | |
| 90 | args: list[str] = [ |
| 91 | self._visit_arg_with_default(arg, defaults[i]) |
| 92 | for i, arg in enumerate(node.posonlyargs) |
| 93 | ] |
| 94 | |
| 95 | if node.posonlyargs: |
| 96 | args.append('/') |
| 97 | |
| 98 | for i, arg in enumerate(node.args): |
| 99 | args.append(self._visit_arg_with_default(arg, defaults[i + posonlyargs])) |
| 100 | |
| 101 | if node.vararg: |
| 102 | args.append('*' + self.visit(node.vararg)) |
| 103 | |
| 104 | if node.kwonlyargs and not node.vararg: |
| 105 | args.append('*') |
| 106 | for i, arg in enumerate(node.kwonlyargs): |
| 107 | args.append(self._visit_arg_with_default(arg, kw_defaults[i])) |
| 108 | |
| 109 | if node.kwarg: |
no outgoing calls
no test coverage detected
searching dependent graphs…