所以,作为一个笑话,我为python编写了一个goto版本,我想用它作为库。我为它写的函数如下。
def goto(loc):
exec(open(__file__).read().split("# "+str(loc))[1],globals())
quit()
这适用于使用goto的文件,例如:
def goto(loc):
exec(open(__file__).read().split("# "+str(loc))[1],globals())
quit()
# hi
print("test")
goto("hi")
但是,如果我在另一个文件中导入goto,它就不能用作
__file__
将始终返回包含该函数的文件,而不是它所使用的文件。是否有一个等效的文件允许我导入一个带有goto函数的文件并让它工作?
答案 0 :(得分:1)
是的,如果您检查调用堆栈,则可以:
import inspect
def goto():
try:
frame = inspect.currentframe()
print(frame.f_back.f_globals['__file__'])
finally:
# break reference cycles
# https://docs.python.org/3.6/library/inspect.html#the-interpreter-stack
del frame
goto()
请注意,调用堆栈实际上依赖于python实现 - 所以对于某些python解释器,这可能实际上不起作用...
当然,我还向您展示了如何获取调用者的全局变量(locals
可以通过frame.f_back.f_locals
找到所有exec
需求。
另请注意it looks like you can implement a jump command写入框架的f_lineno
- 这可能是实施goto
的更好方式。我从来没有这样做,所以我不能真正建议你如何实际编码: - )