'while'不会'破坏'时 self.text由kill函数设置为''。
有人可以帮助我完成这项工作或建议更好的方法吗? 如果字符串变为“',则需要通过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'的工作方式,这对我来说似乎是最干净的方式。
答案 0 :(得分:4)
更新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
答案 1 :(得分:2)
在执行每个函数后,您需要添加text
''
的检查:
class Class(object):
def run(self, text):
self.text = text
func_to_exec = [self.nothing1,self.kill,self.nothing2]
while True:
for func in func_to_exec:
func()
if not self.text:
break
else:
continue #executed only if no 'break' was met (starts the next iteration of `while` loop)
break #get out of the 'while True' loop
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.run('some string')
nothing1
kill
答案 2 :(得分:1)
虽然看起来多余,但如果在每个函数中返回字符串,可以缩短循环。使用延迟评估,这是解决问题的更具功能性的方法:
def run(self, text):
self.text = text
func_to_exec = [self.nothing1, self.kill, self.nothing2]
all(func() for func in func_to_exec) # generator will evaluate func lazily
很好,很清楚,有评论。
答案 3 :(得分:0)
如果属性变为'',则编写一个提升StopIteration的装饰器。