Обновление 2: если ваша цель состоит в том, чтобы пропустить строку через несколько функций, то ваш дизайн по существу полностью неверен.
Каждая функция НЕ должна устанавливать член, но вместо этого принимает строку и возвращает строку,Затем ваш цикл должен проверить, является ли значение хорошим:
currstr = 'foo'
for f in (self.nothing1, self.kill, self.nothing2):
tmpstr = f(currstr)
if not tmpstr: break # or return, or raise exception
currstr = tmpstr
Обновление: очевидно, ваша проблема в том, что вам не нравится, как работают циклы while.В то время как циклы прерываются только тогда, когда выполнение попадает в тест, то есть, когда выполнение входит в тело, без прерывания или исключения, оно продолжается до конца блока и только после этого тест будет переоценен.
Вероятно, самый чистый способ сделать это - обернуть self.text
свойством .
Затем у вас есть три разумных варианта логики в вашей функции свойства:
- Вы можете создать систему обработчиков, которые вызываются при изменении свойства, и делать все, что вам нравится.там (включая логику одной из следующих двух опций);
- Включите определенный тест для пустой строки, создайте исключение для этого и обработайте его вне цикла;или
- Вызывать исключение при каждом отдельном изменении и обрабатывать его внутри цикла.
У вас также есть другой вариант, который заключается в том, чтобы вызвать исключение в kill
во многих случаях.так же, как описано выше.
Ваш код отлично работает для меня:
In [139]: cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:class Class(object):
: def run(self, text):
: self.text = text
:
: while self.text:
: self.nothing1()
: self.kill()
: self.nothing2()
:
: def nothing1(self):
: print 'nothing1'
: self.text = self.text
:
: def kill(self):
: print 'kill'
: self.text = ''
:
: def nothing2(self):
: print 'nothing2'
: self.text = self.text
:
:C = Class()
:C.run('some string')
:--
nothing1
kill
nothing2