我在python中有一個模塊,並且基於已經調用函數的腳本,我想在內部做出決定該模塊。如何從模塊內部,在運行期間知道哪個腳本調用了函數
因此,如果我們有2個文件file1.py
和,那麼都會導入模塊testmod並在其中調用一個函數。在模塊testmod中,我想知道哪個腳本調用了它? file1.py
或。
我想如果寫一個類似的代碼下面testmod 然後 如果做到這一點 別的然後 做 別的 做別的事情!
我在python中有一個模塊,並且基於已經調用函數的腳本,我想在內部做出決定該模塊。如何從模塊內部,在運行期間知道哪個腳本調用了函數
因此,如果我們有2個文件file1.py
和,那麼都會導入模塊testmod並在其中調用一個函數。在模塊testmod中,我想知道哪個腳本調用了它? file1.py
或。
我想如果寫一個類似的代碼下面testmod 然後 如果做到這一點 別的然後 做 別的 做別的事情!
正如已經在評論中指出的那樣,您可以避免這種情況(因爲它是糟糕的設計並且使事情複雜化很多)添加一個參數到該函數。或者,如果內部代碼與時間有很大不同,則可以編寫該函數的兩個版本。
無論如何,如果你想知道你的函數來自哪裏,你需要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()
輸出是一樣的。
看看是否有任何在文檔上traceback
,讓你的想法。
我發表的包裝用簡單的StackFrame解決由單一的參數SPOS覆蓋堆棧幀檢查,這些做什麼名字promisses:
PySourceInfo.getCallerModuleFilePathName
PySourceInfo.getCallerModuleName
參見:
你的用例是什麼?爲什麼'file1'和'file2'不能通過一個額外的參數來切換你的功能? '函數myfunc(arg1,arg2,dosomething = False)'或類似的。 –
如果你的模塊需要知道誰叫它,你將會擊敗模塊化的目的。您應該爲您正在使用的功能添加參數 –