我有一些看起来像这样的代码。
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)在该上下文中循环。因此,要求结合使用with
和while
。
答案 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