我有以下代码:
self.csn(0)
self.spidev.xfer2(txbuffer)
self.csn(1)
首先将csn-Pin设置为低,然后运行spi素材,然后再次将csn-Pin设置为高。这种方法有效,但看起来不太“ pythonic”。是否有一种方法可以“注入”看起来像这样的功能
wrapping_function()
function_todo
这是纯化妆品,但我认为有一种我找不到的方式
答案 0 :(得分:5)
我相信您正在寻找高阶函数:该函数需要另一个函数作为参数:
def run(f):
self.csn(0)
f()
self.csn(1)
然后,例如,使用:
run(lambda: self.spidev.xfer2(txbuffer))
我们正在以lambda
的形式传递一个函数。 run
然后运行对csn
的两次调用之间传递的函数。
答案 1 :(得分:3)
您可以使用contextmanager
。
from contextlib import contextmanager
@contextmanager
def csn_context(csn_obj):
try:
csn_obj.csn(0)
yield
finally:
csn_obj.csn(1)
with csn_context(self):
self.spidev.xfer2(txbuffer)
答案 2 :(得分:0)
您可以使用decorator
:
def wrapping_function(func):
def wrapper(*args, **kwargs):
self.csn(0)
f = func(*args, **kwargs)
self.csn(1)
return f
return wrapper
@wrapping_function
def xfer2(txbuffer):
do_something
答案 3 :(得分:0)
当您说“在另一个函数中包装一个函数”时,我听到装饰器。看一下下面的代码:
import functools
def decorator(func):
@functools.wraps(func)
def wrap(*args, **kwargs):
self.csn(0)
func(*args, **kwargs)
self.csn(1)
return wrap
以上面使用self.spidev.xfer2(txbuffer)
的相同方式,将此装饰器以语法@decorator
放在@functools
函数上。每当您想以这种方式包装函数时,您只需要将装饰器放在函数声明上即可。