簡體   English   中英

如何獲得Python中動態定義函數的源代碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM