- 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