背景
我有一个任务执行程序框架,允许人们编写这样的代码。
class HandleJob(Job):
@Step()
def do_work(self, work_order):
pass
@Step()
def continue_with_doing_work(self, work_order):
pass
框架按定义的顺序调用步骤并传递工作顺序。重要的是要知道,Step
的不同实例可以调用不同的HandleJob
,或者在脚本的不同执行期间也可以调用不同的self
。这意味着开发人员不能在一个Step
中向Step
写东西,并期望它在另一个self
中可用。
有一个专用的位置来存储以后需要的数据,并且文档对此很清楚。但是,我仍然希望能够强制执行“早期失败”。
问题(TLDR)
有什么方法可以锁定范围,以防止开发人员在运行时将变量写入self
。
进一步使事情复杂化。他们应该能够在构造函数中写入WeScan
。
答案 0 :(得分:1)
我找到了解决方法(Overriding __setattr__ at runtime)。
class Job:
_scope_locked = False
def __init__(self, work_order_id, strict=True):
if strict:
self._scope_locked = True
def __setattr__(self, attr, value):
if self._scope_locked:
raise Exception("'self' locked")
else:
super(Job, self).__setattr__(attr, value)
此解决方案的唯一问题是,super必须在子类构造函数中最后调用。哦,很好。