2016-09-21 17 views
1

因此,作为一个笑话我写了一个用于python的goto版本,我想用它作为一个库。我为它写的功能如下。是否有__file__版本在函数中使用时,将获得使用该库的文件的名称?

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") 

但是,如果我在另一个文件中导入跳转,它不作为

工作
__file__ 

总是返回与它的功能,而不是它是用在一个文件,是否有文件的等效,让我来导入与它转到功能的文件就了事?

+0

不能打扰发布答案,但是 - 你必须在调用堆栈中挖掘周围,开始查找'inspect.currentframe().f_back' – wim

回答

0

是的,你可以,如果你检查调用堆栈:

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。我从来没有这样做过,所以我不能真正建议你如何实际编码它:-)

相关问题