[英]How can you get the source code of dynamically defined functions in Python?
在 Python 中動態定義代碼時(例如,通過exec
或從import
以外的其他媒體加載它),我無法獲得定義函數的源代碼。
inspect.getsource
似乎從加載的位置尋找加載的模塊。
import inspect
code = """
def my_function():
print("Hello dears")
"""
exec(code)
my_function() #Works, as expected
print(inspect.getsource(my_function)) ## Fails with OSError('could not get source code')
有沒有其他方法可以獲取動態解釋函數(或其他對象,就此而言)的來源?
有沒有其他方法可以獲取動態解釋函數(或其他對象,就此而言)的來源?
一種選擇是將源文件轉儲到一個文件中並從那里執行,盡管這會使您的文件系統充滿需要清理的垃圾。
一個不太可靠但不那么垃圾的替代方法是從字節碼重建源代碼 (-ish astor.to_source()
,例如使用astor.to_source()
。 它會給你一個“對應”的來源,但與原始資料相比可能會改變格式或丟失元數據。
最簡單的方法是簡單地將原始源附加到創建的函數對象:
code = """
def my_function():
print("Hello dears")
"""
exec(code)
my_function.__source__ = code # has nothing to do with getsource
另一種選擇(盡管在這里可能沒有用,因為我假設您希望從模板動態創建主體)是將代碼對象交換為您已使用正確/相關的 firstlineno 更新的代碼對象(以及可選的文件名,盡管您可以將其設置為編譯語句的一部分)。 僅當出於某種奇怪的原因將 Python 代碼嵌入到其他文件中,但不能或不想將其提取到其自己的模塊以進行正常評估時,這才有用。
你幾乎可以像下面那樣做
import inspect
source = """
def foo():
print("Hello World")
"""
file_name ='/tmp/foo.py' # you can use any hash_function
with open(file_name, 'w') as f:
f.write(source)
code = compile(source, file_name, 'exec')
exec(code)
foo() # Works, as expected
print(inspect.getsource(foo))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.