2012-10-17 39 views
0

我在python中有一個模塊,並且基於已經調用函數的腳本,我想在內部做出決定該模塊。如何從模塊內部,在運行期間知道哪個腳本調用了函數

因此,如果我們有2個文件file1.py和​​,那麼都會導入模塊testmod並在其中調用一個函數。在模塊testmod中,我想知道哪個腳本調用了它? file1.py或​​。

我想如果寫一個類似的代碼下面testmod 然後 如果做到這一點 別的然後 做 別的 做別的事情!

+3

你的用例是什麼?爲什麼'file1'和'file2'不能通過一個額外的參數來切換你的功能? '函數myfunc(arg1,arg2,dosomething = False)'或類似的。 –

+4

如果你的模塊需要知道誰叫它,你將會擊敗模塊化的目的。您應該爲您正在使用的功能添加參數 –

回答

0

正如已經在評論中指出的那樣,您可以避免這種情況(因爲它是糟糕的設計並且使事情複雜化很多)添加一個參數到該函數。或者,如果內部代碼與時間有很大不同,則可以編寫該函數的兩個版本。

無論如何,如果你想知道你的函數來自哪裏,你需要inspect模塊。我不是一個專家,但我不認爲獲取調用該函數的堆棧框架並不難,並從那裏瞭解哪個腳本調用它。

更新:

如果你真的想用inspect並做醜陋的東西,這裏有一個最小的工作示例:

#file a.py 

import inspect 
def my_func(): 
    dad_name = inspect.stack()[1][1] 
    if inspect.getmodulename(dad_name) == 'b': #or whatever check on the filename 
     print 'You are module b!' 
    elif inspect.getmodulename(dad_name) == 'c': 
     print 'You are module c!' 
    else: 
     print 'You are not b nor c!' 

#file b.py 
import a 

a.my_func() 

#file c.py 

import a 
a.my_func() 

#file d.py 
import a 
a.my_func() 

輸出:

$ python b.py 
You are module b! 
$ python c.py 
You are module c! 
$ python d.py 
You are not b nor c! 

如果你想添加功能參數:

#file a.py 
def my_func(whichmod=None): 
    if whichmod == 'b': 
     print 'You are module b!' 
    elif whichmod == 'c': 
     print 'You are module c!' 
    else: 
     print 'You are not B nor C!' 

#files b.py/c.py 
import a 
a.my_func(whichmod='b') # or 'c' in module c 

#file d.py 
import a 
a.my_func() 

輸出是一樣的。

0

Traceback

看看是否有任何在文檔上traceback,讓你的想法。

相關問題