Python 默认是没有 goto 语句的,但是有一个第三方库支持在 Python 里面实现类似于
goto 的功能:https://github.com/snoack/pyt...。
比如在下面这个例子里,
from goto import with_goto @with_goto def func(): for i in range(2): for j in range(2): goto .end label .end return (i, j, k)
func()
在执行第一遍循环时,就会从最内层的 for j in range(2)
跳到函数的return
语句前面。
按理说本文到此就该完了,但是这个库有一个限制,如果嵌套的循环层次太深,就无法工作
。比如下面这几行代码:
@with_goto def func(): for i in range(2): for j in range(2): for k in range(2): for m in range(2): for n in range(2): goto .end label .end return (i, j, k, m, n)
会让它抛出 SyntaxError
。
本文接下来的内容,就是如何打破这个限制。
python-goto 是如何工作的
python-goto
这个库,通过 decorator 的方式修改了传进来的函数 func
的__code__
属性,把插入的字节码暗桩替换成相关的 JMP 语句。具体的琐碎实现细节,
可以参考该项目下 goto.py
这个文件,一共也就不到两百行。
本文开头的例子中,