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))
View Code

 

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())
View Code

 

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))
View Code
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())
View Code

仿照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}
View Code

 

posted @ 2019-06-20 17:37  aidenzdly  阅读(145)  评论(0编辑  收藏  举报