Developer Interface#

This part of the documentation covers all the interfaces of Pynalyser. For parts where Pynalyser depends on external libraries, we document the most important right here and provide links to the canonical documentation.

ACR#

Classes#

class pynalyser.acr.classes.ACR#

The base class for each class of abstract representation of the code. Inherited classes can be dumped by acr.dump, but for that to work properly inherited class should use attr.s.

class pynalyser.acr.classes.ACRWithAttributes(*, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None)#
col_offset: int#
end_col_offset: Optional[int]#
end_lineno: Optional[int]#
lineno: int#
class pynalyser.acr.classes.Asyncable(*, is_async: bool)#
is_async: bool#
class pynalyser.acr.classes.Block#
class pynalyser.acr.classes.BodyBlock#
body: pynalyser.acr.classes.FlowContainer#
class pynalyser.acr.classes.BodyElseBlock#
orelse: pynalyser.acr.classes.FlowContainer#
class pynalyser.acr.classes.Class(name: str, bases: List[ast.expr], keywords: List[ast.keyword], decorator_list: List[ast.expr], metaclass: Optional[type] = None, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None)#
bases: List[ast.expr]#
decorator_list: List[ast.expr]#
is_symbol: bool#
keywords: List[ast.keyword]#
metaclass: Optional[type]#
class pynalyser.acr.classes.CodeBlock#

a.k.a. Basic block

class pynalyser.acr.classes.Comprehension(name: str, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None, generators: List[ast.comprehension])#
generators: List[ast.comprehension]#
class pynalyser.acr.classes.DictComp(key: ast.expr, value: ast.expr, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None, generators: List[ast.comprehension])#
key: ast.expr#
name: str#
value: ast.expr#
class pynalyser.acr.classes.EltComprehension(name: str, elt: ast.expr, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None, generators: List[ast.comprehension])#
elt: ast.expr#
class pynalyser.acr.classes.ExceptHandler(type: Optional[ast.expr], name: Optional[str], *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None)#
name: Optional[str]#
type: Optional[ast.expr]#
class pynalyser.acr.classes.FlowContainer#
add_code(code: Union[ast.Delete, ast.Assign, ast.AugAssign, ast.AnnAssign, ast.Import, ast.ImportFrom, ast.Nonlocal, ast.Global, ast.Pass, ast.Break, ast.Continue, ast.BoolOp, ast.NamedExpr, ast.BinOp, ast.UnaryOp, ast.IfExp, ast.Dict, ast.Set, ast.Await, ast.Yield, ast.YieldFrom, ast.Compare, ast.Call, ast.JoinedStr, ast.Constant, ast.Attribute, ast.Subscript, ast.Name, ast.List, ast.Tuple, pynalyser.acr.classes.Scope]) None#

Add code to latest block, if it’s is not CodeBlock function will add new CodeBlock to blocks and add code there

get_code_block() pynalyser.acr.classes.CodeBlock#
class pynalyser.acr.classes.For(target: ast.expr, iter: ast.expr, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None, is_async: bool)#
iter: ast.expr#
target: ast.expr#
class pynalyser.acr.classes.Function(name: str, args: ast.arguments = NOTHING, decorator_list: List[ast.expr] = NOTHING, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None, is_async: bool)#
args: ast.arguments#
decorator_list: List[ast.expr]#
enclosing: bool#
is_symbol: bool#
class pynalyser.acr.classes.GeneratorExp(elt: ast.expr, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None, generators: List[ast.comprehension])#
name: str#
class pynalyser.acr.classes.If(test: ast.expr, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None)#
test: ast.expr#
class pynalyser.acr.classes.Lambda(args: ast.arguments = NOTHING, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None)#
args: ast.arguments#
name: str#
class pynalyser.acr.classes.ListComp(elt: ast.expr, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None, generators: List[ast.comprehension])#
name: str#
class pynalyser.acr.classes.Loop(*, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None)#
class pynalyser.acr.classes.Match(subject: ast.expr, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None)#
cases: List[pynalyser.acr.classes.MatchCase]#
subject: ast.expr#
class pynalyser.acr.classes.MatchCase(pattern: ast.pattern, guard: Optional[ast.expr])#
guard: Optional[ast.expr]#
pattern: ast.pattern#
class pynalyser.acr.classes.Module(name: str)#

name is the name of the file that this module belongs to

class pynalyser.acr.classes.Name(name: str)#
is_symbol: bool#
name: str#
class pynalyser.acr.classes.Scope(name: str)#
enclosing: bool#
class pynalyser.acr.classes.ScopeWithAttributes(name: str, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None)#
class pynalyser.acr.classes.SetComp(elt: ast.expr, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None, generators: List[ast.comprehension])#
name: str#
class pynalyser.acr.classes.Try(*, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None)#
finalbody: pynalyser.acr.classes.FlowContainer#
handlers: List[pynalyser.acr.classes.ExceptHandler]#
class pynalyser.acr.classes.While(test: ast.expr, *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None)#
test: ast.expr#
class pynalyser.acr.classes.With(items: List[ast.withitem], *, lineno: int, col_offset: int, end_lineno: Optional[int] = None, end_col_offset: Optional[int] = None, is_async: bool)#
items: List[ast.withitem]#

Utils#

class pynalyser.acr.utils.ACRCodeTransformer#

Allows to change contents of the code (of the CodeBlock)

generic_visit(node: Union[pynalyser.acr.classes.ACR, ast.AST]) Any#
class pynalyser.acr.utils.Context(annotate_fields, include_attributes, indent)#
annotate_fields: bool#

Alias for field number 0

include_attributes: bool#

Alias for field number 1

indent: Optional[str]#

Alias for field number 2

class pynalyser.acr.utils.NodeVisitor#
acr_generic_visit(node: Union[pynalyser.acr.classes.ACR, ast.AST]) Any#
auto_generic_visit: bool = True#
block: pynalyser.acr.classes.Block#
generic_visit(node: Union[pynalyser.acr.classes.ACR, ast.AST]) Any#
scope: pynalyser.acr.classes.Scope#
start(init_scope_block: pynalyser.acr.classes.Scope) Any#
strict: bool = False#
visit(node: Union[pynalyser.acr.classes.ACR, ast.AST]) Any#
pynalyser.acr.utils.dump(obj: Union[pynalyser.acr.classes.ACR, ast.AST], annotate_fields: bool = True, include_attributes: bool = False, *, indent: Optional[Union[str, int]] = None) str#

Translation#

class pynalyser.acr.translation.ForBlocks#
blocks: pynalyser.acr.classes.FlowContainer#
class pynalyser.acr.translation.Translator#
container: pynalyser.acr.classes.FlowContainer#
handle_block(block: pynalyser.acr.classes.Block, node: ast.AST) None#
handle_block_without_appending(block: pynalyser.acr.classes.Block, node: ast.AST) None#
handle_fields_of_block(block: pynalyser.acr.classes.Block, node: ast.AST) None#
handle_scope(scope: pynalyser.acr.classes.Scope, node: ast.AST) pynalyser.acr.classes.Scope#
handle_stmt_scope(scope: pynalyser.acr.classes.Scope, node: Union[ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef]) None#
my_visit_ExceptHandler(node: ast.ExceptHandler) pynalyser.acr.classes.ExceptHandler#
translate_from_module(module: ast.Module, name: str) pynalyser.acr.classes.Module#
visit_AnnAssign(node: ast.AnnAssign) ast.AnnAssign#
visit_Assert(node: ast.Assert) ast.Assert#
visit_Assign(node: ast.Assign) ast.Assign#
visit_AsyncFor(node: ast.AsyncFor) ast.AsyncFor#
visit_AsyncFunctionDef(node: ast.AsyncFunctionDef) ast.AsyncFunctionDef#
visit_AsyncWith(node: ast.AsyncWith) ast.AsyncWith#
visit_AugAssign(node: ast.AugAssign) ast.AugAssign#
visit_Break(node: ast.Break) ast.Break#
visit_ClassDef(node: ast.ClassDef) ast.ClassDef#
visit_Continue(node: ast.Continue) ast.Continue#
visit_Delete(node: ast.Delete) ast.Delete#
visit_DictComp(node: ast.DictComp) pynalyser.acr.classes.Scope#
visit_Expr(node: ast.Expr) ast.Expr#
visit_For(node: ast.For) ast.For#
visit_FunctionDef(node: ast.FunctionDef) ast.FunctionDef#
visit_GeneratorExp(node: ast.GeneratorExp) pynalyser.acr.classes.Scope#
visit_Global(node: ast.Global) ast.Global#
visit_If(node: ast.If) ast.If#
visit_Import(node: ast.Import) ast.Import#
visit_ImportFrom(node: ast.ImportFrom) ast.ImportFrom#
visit_Lambda(node: ast.Lambda) pynalyser.acr.classes.Scope#
visit_ListComp(node: ast.ListComp) pynalyser.acr.classes.Scope#
visit_Match(node: ast.Match) ast.Match#
visit_Module(node: ast.Module) NoReturn#
visit_NamedExpr(node: ast.NamedExpr) ast.NamedExpr#
visit_Nonlocal(node: ast.Nonlocal) ast.Nonlocal#
visit_Pass(node: ast.Pass) ast.Pass#
visit_Raise(node: ast.Raise) ast.Raise#
visit_Return(node: ast.Return) ast.Return#
visit_SetComp(node: ast.SetComp) pynalyser.acr.classes.Scope#
visit_Try(node: ast.Try) ast.Try#
visit_While(node: ast.While) ast.While#
visit_With(node: ast.With) ast.With#
visit_match_case(node: ast.match_case) ast.match_case#
pynalyser.acr.translation.translate_ast_to_acr(tree: ast.Module, name: str) pynalyser.acr.classes.Module#