- functools.partial使用
偏函数(Partial function)是修改函数签名,通过将一个函数的部分参数预先绑定为某些值,从而得到一个新的具有较少可变参数的函数;
"""
functools.partial
偏函数(Partial function)是通过将一个函数的部分参数预先绑定为某些值,从而得到一个新的具有较少可变参数的函数
用法:
1.在 asyncio add_done_callback 中的使用
"""
import asyncio
import functools
async def do_some_work(x):
print("waiting:", x)
return "Done after {}s".format(x)
def callback(future, a, b):
print("callback:", a, b, future.result())
def callback_no_param(future):
print("callback_no_param:", future.result())
# 使用 functools.partial 让 callback 添加2个参数
# add_done_callback 的参数是一个可调用函数,但是 又想 在 可调用函数 中添加参数,那就用 functools.partial
coroutine = do_some_work(2)
loop = asyncio.get_event_loop()
task1 = asyncio.ensure_future(coroutine)
print(task1)
task1.add_done_callback(functools.partial(callback, a=22, b=33))
print(task1)
loop.run_until_complete(task1)
print('!' * 10)
# add_done_callback 调用callback 不添加参数
coroutine = do_some_work(3)
loop = asyncio.get_event_loop()
task1 = asyncio.ensure_future(coroutine)
print(task1)
task1.add_done_callback(callback_no_param)
print(task1)
loop.run_until_complete(task1)
"""
functools.partial
偏函数(Partial function)是通过将一个函数的部分参数预先绑定为某些值,从而得到一个新的具有较少可变参数的函数
用法:
1.用于重构代码;如下实例,一个函数有多个参数,如果 几个参数值是固定的,可以提取出来,从而减少参数调用
"""
from functools import partial
def chat_with(who, where, topic):
"""
和谁 在哪 聊 什么话题
:param who: 和谁聊天
:param where: 在哪聊天
:param topic: 聊什么话题
:return:
"""
return f'hello,{who},do you have time, I want to chat with you about {topic} in the {where},Thanks!'
chat_with_lucy = partial(chat_with, 'lucy')
chat_with_tom = partial(chat_with, 'tom')
chat_with_jerry = partial(chat_with, 'jerry')
chat_with_parents = partial(chat_with, 'parents')
print(chat_with_lucy('home', 'lover'))
print(chat_with_tom('park', 'sea'))
print(chat_with_jerry('street', 'clothes'))
# 一个参数固定,其他参数不同,从而减少参数个数
print(chat_with_parents('school', 'math'))
print(chat_with_parents('tree', 'bird'))
# 可以指定参数,不用按照函数顺序进行调用
chat_where = partial(chat_with, where='school')
print(chat_where(who='Tom', topic='Python'))
https://blog.csdn.net/Zjack_understands/article/details/80242946
https://baijiahao.baidu.com/s?id=1613459698249266824&wfr=spider&for=pc
- partialmethod使用
和partial实现相同的功能,只是 partial在类方法中使用会报错,而此函数用在类方法中;
class Cell(object):
def __init__(self):
self._alive = False
@property
def alive(self):
return self._alive
def set_state(self, state):
self._alive = bool(state)
set_alive = partialmethod(set_state, True)
set_dead = partialmethod(set_state, False)
c = Cell()
c.alive # 结果为:False
c.set_alive()
c.alive # 结果为:True