【问题标题】:Break method 1 from method 2 which is called in method 1 python从方法 2 中中断方法 1,在方法 1 python 中调用
【发布时间】:2013-10-03 07:43:54
【问题描述】:

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

之后,我会向你解释整个事件;

我正在用 python 编写一个程序,其中我有一个带有一些方法的类,其中一个方法 (method1),在配置数据列表和方法 2 的循环中运行该类的另一个方法 (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

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

【问题讨论】:

  • 你的问题没有答案,因为在 Python 中破坏调用堆栈上的东西是不可能的。使用异常或return 值以获得正确的解决方案。

标签: python methods class-method


【解决方案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
>>>

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 断言会停止整个程序,但我不想要它。我认为您关于抛出异常并在 method1 中捕获它的想法值得一试;你能解释更多或给我一个资源来理解它吗?
    【解决方案3】:
    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-12-06
      • 2021-06-21
      • 1970-01-01
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2013-08-13
      相关资源
      最近更新 更多