31 lines
844 B
Python
31 lines
844 B
Python
import sys
|
|
from dataclasses import dataclass
|
|
from typing import Any
|
|
from IPython import embed
|
|
|
|
@dataclass
|
|
class ConstVar:
|
|
frame: Any # too lazy to type hint correctly. Doesn't matter
|
|
name: str
|
|
value: Any
|
|
|
|
ConstList= []
|
|
|
|
def checkConsts(*a):
|
|
for cvar in ConstList:
|
|
if cvar.frame.f_locals[cvar.name] != cvar.value:
|
|
cvar.frame.f_locals[cvar.name] = cvar.value
|
|
raise SyntaxError('Cannot assign value to constant')
|
|
|
|
class ConstSetter:
|
|
def __setattr__(self, key, value):
|
|
target_frame = sys._getframe(1)
|
|
target_frame.f_locals[key] = value
|
|
target_frame.f_trace = checkConsts
|
|
target_frame.f_trace_opcodes = True
|
|
target_frame.f_trace_lines = False
|
|
ConstList.append(ConstVar(target_frame, key, value))
|
|
|
|
const = ConstSetter()
|
|
sys.settrace(lambda *a: None)
|