2016-09-21 16 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。我從來沒有這樣做過,所以我不能真正建議你如何實際編碼它:-)

相關問題