Flask-偏函数
偏函数说明
- 导入 import:from functools import partial
- 第一个参数:自定义函数或者是python内置函数
- 第二个参数:可变参数,如果没有指定关键字,按原有函数的参数顺序进行补充,参数将作 用在原函数上,如果指定关键字就对应到所指位置
1.基础版
def add(arg1, arg2): return arg1 +arg2 if __name__ == "__main__": # 重新生成一个偏函数对象(其中一个参数已知),并赋予mysum,然后再调用这个新函 # 数对象,10为预先设定的参数 mysum = partial(add, 10) print(mysum(5))
2.关键字版
def add(arg1, arg2=2): return arg1+ arg2 def add2(arg1=2, arg2=3): return arg1+ arg2 if __name__ == "__main__": mysum = partial(add, 10) print(mysum()) # 也可根据关键字预先设定的参数值 mysum2 = partial(add, arg2=3) print(mysum2(1)) # 如果没有关键字,按原有参数顺序补充 mysum3 = partial(add2, 1) print(mysum3())
3.升级版
from functools import partial class User(object): def __init__(self, name, age): self.name = name self.age = age def get_user_info(user, property_name): value = eval('user.' + property_name) return value if __name__ == "__main__": user = User('aidenzdly', 20) func = partial(get_user_info, property_name='age') print(func(user))
from functools import partial class Foo(object): def __init__(self): self.request = "request" self.session = "session" foo = Foo() def func(args): return getattr(foo,args) re_func = partial(func,'request') se_func = partial(func,'session') print(re_func())
仿照flask来实现一个更复杂的
from functools import partial class HttpRequest(object): def __init__(self): self.method = 'GET' self.body = b"name=abc@age=123" class Foo(object): def __init__(self): self.request = HttpRequest() self.session = {'login':True,'is_super':False} foo = Foo() def func(args): return getattr(foo,args) re_func = partial(func,'request') se_func = partial(func,'session') print('re_func:',re_func)# re_func: functools.partial(<function func at 0x00000116C4071E18>, 'request') print('se_func:',se_func)# se_func: functools.partial(<function func at 0x00000116C4071E18>, 'session') print(re_func())# <__main__.HttpRequest object at 0x00000116C4257CF8> print(se_func())# {'login': True, 'is_super': False} class LocalProxy(object): def __init__(self,local): self._local = local def _get_current_object(self): return self._local() def __getitem__(self, item): return getattr(self._get_current_object(),item) request = LocalProxy(re_func) # 层层向上找 ret = request._get_current_object().method body = request._get_current_object().body print(ret) # GET print(body) # b'name=abc@age=123' ret = request['method'] print(ret) # GET session = LocalProxy(se_func) print(session._get_current_object()) # {'login': True, 'is_super': False}