“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

09-10 04:38
查看更多