2015-01-07 101 views
0

我可以使用inspect.getsource(obj)得到函數的源代碼。如何檢查打印源代碼

print(inspect.getsource(gcd)) 

它打印gcd函數的源代碼。當我嘗試以下時,它會引發錯誤。

>>>print(inspect.getsource(print)) 

    File "<stdin>", line 1 
    print(inspect.getsourcelines(print)) 
           ^
    SyntaxError: invalid syntax 

我可以得到打印的源代碼嗎?如果是的話,如果沒有,爲什麼?

+3

不,因爲'print'是一個用C編寫的函數,'inspect'只能得到Python函數的源碼。 – vaultah

+1

您知道python是開源的,因此整個源代碼都可以在線獲得,對嗎?你可以從存儲庫直接獲取它,而不是使用'inspect'(這引發了語法錯誤,因爲'print'是python 2中的一個語言關鍵字,而不是python 3中的函數)。 – l4mpi

+0

@ l4mpi雅,我知道python是開源的。所以只有我試圖查看打印的源代碼。 – Venkatesh

回答

4

回答增加更多信息比vaultah提供的愚蠢目標。

下面的答案直接解決了3.x,我注意到你仍然在2.x.對此有一個很好的說明,看看這個answer

你實際上在這方面走的是正確的道路,但問題是,print是一個內置的,所以inspect.getsource不會在這裏很好。

這就是說:

>>> inspect.getsource.__doc__ 
'Return the text of the source code for an object. 

The argument may be a module, class, method, function, traceback, frame,  
or code object. The source code is returned as a single string. An 
OSError is raised if the source code cannot be retrieved.' 

,並在那裏爲printtype

>>> type(print) 
<class 'builtin_function_or_method'> 

更具體地說:

>>> print.__module__ 
'builtins' 

多麼不幸,它不是由getsource支持。

你必須選擇:

1)通過Python source code走,看看你的內置已經實施。就我而言,我幾乎總是使用CPython,所以我從CPython directory開始。

由於我們知道我們正在尋找builtin模塊,因此我們進入/Python目錄,並尋找看似包含內置模塊的東西。 bltinmodule.c是一個安全的猜測。由於知道打印必須被定義爲可被調用的功能,因此請搜索print(,然後我們右跳到builtin_print(Pyobject...定義的位置。

2)猜測內置函數名稱慣例並在代碼回購中搜索builtin_print

3)使用一種可以在幕後執行魔法的工具,例如Puneeth Chaganti的Cinspect

+0

您的答案適用於Python 3.x,但OP使用Python 2.7,其中'print'是一個聲明。 –

+0

@brunodesthuilliers是啊,我注意到後發佈。我必須跑去處理重要的事情,稍後再編輯。 –