Пределы типа Nat в Shapeless

Не прямо, за этот старый мой рецепт - но, как говорится в рецепте, легко построить семантический эквивалент, например. если вам нужно транслитерировать непосредственно из 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

147
задан TryinHard 21 August 2015 в 06:33
поделиться