繁体   English   中英

如何在实例化之前更改 __init__ 参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM