首先,我应该说我不知道这个话题是否足够好,但在一行中解释我的问题真的很难。
之后,我会向你解释整个事件;
我正在python中编写一个程序,其中我有一个带有一些方法的类和一个这样的方法(method1),在一个循环中运行配置数据列表的另一个方法(method2)和方法2我打电话给班上的其他一些方法。代码是这样的:
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
,因为它会停止整个程序,我只想跳过这个特殊成员并继续在method1中循环。换句话说,列表中的某些成员会在某些情况下无法继续使用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
我不知道这个问题有多清楚,但如果你想要任何解释,请问我。 我将不胜感激。
答案 0 :(得分: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
>>>
答案 1 :(得分: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
答案 2 :(得分:0)
抛出异常,然后在method1
中捕获它。哪个BTW是assert
所做的,它会抛出AssertionError
,你可以捕捉到它。它只是在程序一直到解释器时结束程序。