在python3中将函数包装在另一个函数周围

时间:2018-08-23 12:56:39

标签: python python-3.x

我有以下代码:

self.csn(0)
self.spidev.xfer2(txbuffer)
self.csn(1)

首先将csn-Pin设置为低,然后运行spi素材,然后再次将csn-Pin设置为高。这种方法有效,但看起来不太“ pythonic”。是否有一种方法可以“注入”看起来像这样的功能

wrapping_function()
    function_todo

这是纯化妆品,但我认为有一种我找不到的方式

4 个答案:

答案 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函数上。每当您想以这种方式包装函数时,您只需要将装饰器放在函数声明上即可。