如何将产量与lambda一起使用?

时间:2016-04-21 06:01:20

标签: python lambda yield contextmanager

我试图编写一个上下文管理器或类似的东西,可以用来重复尝试一些代码。在实际项目中有很多很多东西需要尝试,所以我不想为每个东西编写一个单独的函数,而且我也在处理主要范围内的一个大对象,可以&# 39;很容易传递给函数等,所以我尝试使用一些简单的代码行,我可以在主要范围内重复尝试。

在不使用典型函数定义的情况下重复尝试某种方法的一种方法是使用带有retrying模块retry函数的lambda:

test = retrying.retry(lambda: print(1 / random.randint(0, 1)))
test()

我喜欢写的东西更少,有点像这样:

with nolube():
    print(1 / random.randint(0, 1))

我试图在上下文管理器中对此进行编码,但是在将lambda与yield混合时可能会遇到困难(语法无效),这可能表明对收益率缺乏了解。是否有一些(可能是hacky)方式接近这个?

from __future__ import print_function
import contextlib
import random
import retrying

def main():

    with nolube():
        print(1 / random.randint(0, 1))

@contextlib.contextmanager
def nolube(
    tries = None # None: try indefinitely
    ):
    """
    Create a context for trying something repeatedly.
    """
    tries_done = 0
    rekt = True
    if tries is None:
        while rekt is True:
            try:
                code = lambda: yield
                code()
                rekt = False
            except:
                tries_done += 1
                pass
    else:
        while rekt is True and tries_done <= tries:
            try:
                code = lambda: yield
                code()
                rekt = False
            except:
                tries_done += 1
                pass

if __name__ == "__main__":
    main()

这是语法错误:

    code = lambda: yield
                   ^
SyntaxError: invalid syntax

以下是使用retrying模块的问题:

from __future__ import print_function
import contextlib
import random
import retrying

def main():

    with nolube():
        print(1 / random.randint(0, 1))

@contextlib.contextmanager
def nolube():
    """
    Create a context for trying something repeatedly.
    """
    code = retrying.retry(lambda: yield)
    code()

if __name__ == "__main__":
    main()

0 个答案:

没有答案