[英]How to change __init__ param before instantiation
我想实现这样一个简单的界面:
IsAllowed(perms=[IsAdmin(runtime_value) | HasPerm('*')])
由于实例化时的某些变量不可用,我不得不推迟评估perms=[IsAdmin() | HasPerm('*')]
perms=[IsAdmin() | HasPerm('*')]
到稍后的时间点(当我正在使用的 FastAPI 网络框架在 IsAllowed 上__call__
时)。 我最接近实现这一目标的是:
IsAllowed(perms = lambda runtime_value: [IsAdmin(runtime_value) | HasPerm('*')])
class IsAllowed(object):
def __init__(self, perms=None):
self.perms = perms
def __call__(self, runtime_value):
result = self.perms(runtime_value)
return result
不,我的问题是,有没有办法将接口保持为IsAllowed(perms=[IsAdmin(runtime_value) | HasPerm('*')])
但是,在实例化之前以某种方式将lambda
注入其中?
我正在考虑元类或利用__init_subclass__
钩子? 有任何想法吗?
如果我正确理解你的问题,你想要这样的东西:
from typing import Any
class IsAllowed(object):
def __init__(self, *perms):
self.perms = perms
def __call__(self, args: list[Any]):
return all(self.perms[i](args[i]) for i in range(len(args)))
checker = IsAllowed(IsAdmin, HasPerm)
checker(“somevalue”, “*”)
更新:
对于评论部分提到的案例:
from typing import Any, Callable
class Operation:
pass
class Or(Operation):
def __init__(self, *funcs: Callable[[Any], bool]) -> None:
self.funcs = funcs
def __call__(self, val: Any) -> bool:
return any(func(val) for func in self.funcs)
def __or__(self, other: Operation) -> Operation:
return Or(*self.funcs, other.func)
class Predicate:
def __init__(self, func: Callable[[Any], bool]) -> None:
self.func = func
def __or__(self, other) -> Or:
return Or(self.func, other.func)
def Is1(x: int) -> bool:
return x == 1
def Is2(x: int) -> bool:
return x == 2
def Is3(x: int) -> bool:
return x == 3
def main() -> None:
pred1 = Predicate(Is1)
pred2 = Predicate(Is2)
pred3 = Predicate(Is3)
fancy_pred = pred1 | pred2 | pred3
for i in range(5):
print(fancy_pred(i))
if __name__ == "__main__":
main()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.