From 5b3dd0ed5db0c5b6e5ff7ea97e980c3cbc7d13a2 Mon Sep 17 00:00:00 2001 From: RemiZOffAlex Date: Sat, 21 Mar 2026 00:52:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20executor/handlers/state.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- executor/handlers/state.py | 104 +++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 executor/handlers/state.py diff --git a/executor/handlers/state.py b/executor/handlers/state.py new file mode 100644 index 0000000..2025d55 --- /dev/null +++ b/executor/handlers/state.py @@ -0,0 +1,104 @@ +__author__ = 'RemiZOffAlex' +__email__ = 'remizoffalex@mail.ru' + +from uuid import uuid4 + + +def closure_include(name): + def closure_filter(closure): + return closure['child']==name + return closure_filter + + +def closure_exclude(name): + def closure_filter(closure): + return closure['child']!=name + return closure_filter + + +def scope_addition(context, parent = None): + name = str(uuid4()) + context.scopes[name] = {} + if parent: + context.closures.append({ + 'parent': parent, + 'child': name + }) + else: + context.closures.append({ + 'parent': context.current, + 'child': name + }) + return name + +# def scope_del(context, name): +# closures = [] +# for item in context.closures: +# if item['child'] != name: +# closures.append(item) +# context.closures = closures +# del context.scopes[name] + +def scope_del(context, name): + if name in context.scopes: + context.closures = list( + filter( + closure_exclude, + context.closures + ) + ) + del context.scopes[name] + return + raise Exception('Область видимости {} не найдена'.format(name)) + +def variable_addition(context, name, value = None): + current = context.scopes[context.current] + if name in current: + raise Exception('Double declaration of the variable %s' % name) + current[name] = value + + +def variable_delete(context, name): + current = context.scopes[context.current] + if name in current: + del current[name] + raise Exception('Переменная {} не найдена'.format(name)) + + +def variable_exist(context, name): + current = context.scopes[context.current] + return name in current + + +def variable_get(context, name): + scope = context.scopes[context.current] + if name in scope: + result = scope[name] + return result + stack = [] + if context.current != 'root': + stack.append(context.current) + while len(stack) > 0: + scope_name = stack.pop() + closures = list( + filter( + closure_include(scope_name), + context.closures + ) + ) + for closure in closures: + stack.append(closure['parent']) + scope = context.scopes[scope_name] + if name in scope: + result = scope[name] + return result + + raise Exception('Переменная {} не найдена'.format(name)) + + +def variable_set(context, name, value): + current = context.scopes[context.current] + if name in current: + current[name] = value + return + raise Exception('Переменная {} не найдена'.format(name))