是否有结合“ while”和“ with”的Python结构?

时间:2019-05-09 21:42:17

标签: python

我有一些看起来像这样的代码。

condition = <expression>
while condition:
    <some code>

我希望能够编写该代码,而不必编写单独的语句来创建条件。例如,

while <create_condition(<expression>)>:
    <some code>

这里有两种可能不起作用,但这会伤我的痒。

with <expression> as condition:
    <some code>

问题在于它不会循环。如果将 while 嵌入到 with 内,我将回到开始的地方。

定义我自己的功能来做到这一点。

def looping_with(<expression>, <some code>):
   <define looping_with>

此问题是,如果<some code>作为 lambda 表达式传递,则仅限于单个表达式。我见过的任何变通办法都没有吸引力。

如果将<some code>作为实际的 def 传递,则会出现语法错误。您不能将函数定义作为参数传递给另一个函数。

可以在其他地方定义该函数,然后再传递该函数。但是 with while lambda 的意义在于代码本身,而不是对代码的引用被嵌入到上下文中。 (我的代码的原始版本并不糟糕,比这更好。)

任何建议将不胜感激。

更新 :(就像戴夫·比兹利(Dave Beazley)喜欢说的那样:您会讨厌这个。) 我不愿提供这个示例,但这就像我要尝试的那样。

class Container:
    def __init__(self):
        self.value = None

class Get_Next:

    def __init__(self, gen):
        self.gen = gen

    def __call__(self, limit, container):
        self.runnable_gen = self.gen(limit, container)
        return self

    def get_next(self):
        try:
            next(self.runnable_gen)
            return True
        except StopIteration:
            return False


@Get_Next
def a_generator(limit, container):
    i = 0
    while i < limit:
        container.value = i
        yield
        i += 1


container = Container()

gen = a_generator(5, container)
while gen.get_next():
    print(container.value)
print('Done')

运行时,输出为:

0
1
2
3
4
Done

建议。为免您认为这太过分了,有一种非常简单的方法可以产生相同的结果。从a_generator中删除装饰器,然后运行:

for _ in a_generator(5, container):
    print(container.value)
print('Done')

结果是相同的。

问题是for _ in <something>对我来说太难看了。

因此,我真正要寻找的是一种以更好的语法获得for _ in <something>功能的方法。语法应(a)表示我们正在建立上下文,并且(b)在该上下文中循环。因此,要求结合使用withwhile

1 个答案:

答案 0 :(得分:0)

您可以使用context manager class来完成类似的事情:

class Condition:
    def __init__(self, cond):
        self.cond = cond

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        pass

    def __call__(self, *args, **kwargs):
        return self.cond(*args, **kwargs)


with Condition(lambda x: x != 3) as condition:
    a = 0
    while condition(a):
        print('a:', a)
        a += 1

输出:

a: 0
a: 1
a: 2