0

首先我应该说我不知道​​这个话题是否足够好,但是用一句话解释我的问题真的很难。

之后,我将向您解释整个事件;

我正在用python编写一个程序,其中我有一个带有一些方法的类,其中一个方法(method1),在配置数据列表的循环中运行该类的另一个方法(method2),在method2中我调用了一些类的其他方法。代码是这样的:

class myClass():
    def method1(self):
        for member in some_list:
            method2(member)

    def method2(self, member):
        do something with the member
        self.method3()
        self.method4()
        self.method5()
        ...

在 method2 中,有些情况我想从方法内部停止 method2。我的意思是有时我想在方法 3 或方法 4 中停止方法 2。

我不想使用assert,因为它会停止整个程序,我只想跳过这个特殊成员并继续方法 1 中的循环。换句话说,列表的某些成员造成了一些我们无法继续method2的情况,我们应该停在那里并为列表的下一个成员启动method2的过程。

我现在可以返回 True 和 False 值并检查它以确定是否要通过return关键字停止,但我不想使用这种方法。我真正想要的是编写一个方法,在这些情况下,我调用它并且该方法停止 method2 执行并返回到 method1 中的第一个循环以选择另一个成员。我可以写一个例子:

def method3(self):
    do something 
    if some_special_situation:
        method_stop()
    else:
        continue execution

def method_stop():
    do something to stop the method which is calling it
    and the method that the first method is called there
    I mean if method2 is calling method3 and method3 is calling method_stop
    method_stop should stop both method2 and method3

我不知道这个问题有多清楚,但是如果您需要任何解释,请问我。我将不胜感激。

4

3 回答 3

1

如果方法不是method1私有的(否则外部调用者必须处理异常),则使用异常将是最直接的方法:

class MyClass():
    class ContinueException(Exception):
        pass

    def method1(self, members):
        for member in members:
            try:
                print "in method1 with ", member
                self.method2(member)
            except MyClass.ContinueException:
                pass

    def method2(self, member):
        print "->in method2 with ", member
        self.method3(member)
        self.method4(member)

    def method3(self, member):
        print "--->in method3 with ", member
        if member % 2 == 0:
            raise MyClass.ContinueException()

    def method4(self, member):
        print "----->in method4 with ", member

member是偶数时,将引发异常,method3因此method4不会被调用:

>>> c = MyClass()
>>> c.method1([1,2,3,4])
in method1 with  1
->in method2 with  1
--->in method3 with  1
----->in method4 with  1
in method1 with  2
->in method2 with  2
--->in method3 with  2
in method1 with  3
->in method2 with  3
--->in method3 with  3
----->in method4 with  3
in method1 with  4
->in method2 with  4
--->in method3 with  4
>>>
于 2013-10-03T08:18:51.823 回答
0
method1():
    method_names = ["method1","method2",...]
    for name in method_names:
        if !getattr(self, name)():
            return False
    #more code

method2():
    #epic code goes here
    if bad_stuff_happens:
        return False
    #epic code goes here
    return True
于 2013-10-03T07:59:48.350 回答
0

只需抛出一个异常,并将其捕获到method1. assert顺便说一句,它会抛出什么,AssertionError你可以抓住它。当程序一直落到解释器时,它只是结束程序。

于 2013-10-03T08:00:35.980 回答