是否有__file__的版本,当在函数中使用时,将获得使用该库的文件的名称?

时间:2016-09-21 00:33:55

标签: python python-3.x goto

所以,作为一个笑话,我为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函数的文件并让它工作?

1 个答案:

答案 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的更好方式。我从来没有这样做,所以我不能真正建议你如何实际编码: - )