Не прямо, за этот старый мой рецепт - но, как говорится в рецепте, легко построить семантический эквивалент, например. если вам нужно транслитерировать непосредственно из C-кодированного эталонного алгоритма (до рефакторинга на более -диоматический Python, конечно ;-). Т.е.:
class DataHolder(object):
def __init__(self, value=None): self.value = value
def set(self, value): self.value = value; return value
def get(self): return self.value
data = DataHolder()
while data.set(somefunc()):
a = data.get()
# use a
BTW, очень идиоматическая питоническая форма для вашего конкретного случая, если вы точно знаете, какое значение falsish somefunc
может вернуться, когда оно вернет значение фальшивости (например, 0
),
for a in iter(somefunc, 0):
# use a
, поэтому в этом конкретном случае рефакторинг будет довольно простым; -).
Если return может быть любым значением falsish (0, None
, ''
, ...), одна из возможностей:
import itertools
for a in itertools.takewhile(lambda x: x, iter(somefunc, object())):
# use a
, но вы можете предпочесть простой пользовательский генератор:
def getwhile(func, *a, **k):
while True:
x = func(*a, **k)
if not x: break
yield x
for a in getwhile(somefunc):
# use a