“while”不“break”when
kill函数将self.text设置为“”。
有人能帮我做这个工作吗?或者建议一个更好的方法?
如果字符串变为“”,则需要通过退出的10+个函数运行字符串
返回每个函数内部似乎都是多余的。
class Class(object):
def run(self, text):
self.text = text
while self.text:
self.nothing1()
self.kill()
self.nothing2()
return self.text # stop if all functions run
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')
澄清:
目标是在多个函数中运行一个字符串,以便在其中任何一个函数将字符串设置为“”时仅停止一次。显然,我误解了“while”的工作方式,这对我来说似乎是最干净的方式。
最佳答案
更新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循环的工作方式。虽然循环只有在执行命中测试时才会中断—也就是说,一旦执行进入主体,没有中断或异常,它将继续到块的末尾,然后才会重新评估测试。
可能最干净的方法是用property包装
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