限制python方法
restrict的Python项目详细描述
限制
限制python方法
示例1
fromrestrictimport*importbuiltinsr=Restrictor()restriction=Restriction(builtins,['__import__','__build_class__'],Access.BY_CASE)r.restrict(restriction)withcase(hash(id(restriction)))asensured_call:collections=ensured_call(builtins.__import__,'collections')Y=ensured_call(builtins.__build_class__,lambda:...,'Y')assertisinstance(Y,type)print(collections.defaultdict(list))try:importmathexceptCaseError:print('Case error on import')try:classX:passexceptCaseError:print('Case error on build class')
输出
defaultdict(<class 'list'>, {})
Case error on import
Case error on build class
例2
fromrestrictimport*classTaskManager:def__init__(self):self.tasks={}defadd_task(self,task:str,*items):self.tasks[task]=itemsdefpop_task(self):returnself.tasks.popitem()defget_tasks(self,task:str):returnself.tasks[task]defadd(self,x1,x2):returnx1+x2restrictor=Restrictor()
按情况
restriction=Restriction(TaskManager,["add_task","pop_task",TaskManager.get_tasks,"add"],Access.BY_CASE)restrictor.restrict(restriction)t=TaskManager()try:t.add(3,2)exceptCaseError:print("A case error just occured")withcase(hash(id(restriction)))asensured_call:z=ensured_call(t.add,3,2)assertz==5
输出
A case error just occured
按所有者
restrictor = Restrictor()
restriction = Restriction(
TaskManager, ["add_task", "pop_task", TaskManager.get_tasks, "add"], Access.BY_OWNER
)
restrictor.restrict(restriction)
t = TaskManager()
t.add_task("a", "b")
y = t.add(3, 2)
assert y == 5
try:
z = TaskManager.add(object(), 3, 2)
assert z == 5
except OwnerError as exc:
print("An owner error just occured")
输出
An owner error just occured