def modify_attr(attr: ast.Attribute) -> None: if ( isinstance(attr.value, ast.UnaryOp) and isinstance(attr.value.op, ast.Invert) and isinstance(attr.value.operand, (ast.Constant, ast.JoinedStr)) ): attr.value = ast.Call( func=ast.Name(id='run_shell', ctx=ast.Load()), args=[attr.value.operand], keywords=[] )
def visit_Attribute(self, node: ast.Attribute) -> Any: if type(node.value) == ast.Attribute: node.value = self.visit(node.value) return node if node.value.id != 'self': return node node.value.id = '__STORAGE__' return node
def visit_Attribute(self, attr: ast.Attribute) -> ast.Attribute: attr.value = self.modify_expr(attr.value) super().generic_visit(attr) return attr