盤點Python中那些不為人知的冷知識,如何獲取模塊類和函數原始碼

2020-12-17 python高手養成

前面內容我們使用inspect模塊獲取了模塊、類、函數的詳細信息和幫助文檔以及一個類的層次結構。今天,我們來看下如何使用inspect模塊獲取模塊、類、方法、函數的原始碼。

準備好,馬上出發!

獲取方法

通過下面方法獲取原始碼及位置信息

有以下三種方法

inspect.getsource(obj)

參數可以是模塊(models)、類(class)、方法(method)、函數(function)、回溯(traceback)、幀(frame),或代碼(code)對象。原始碼作為單個字符串被返回。如果傳入的對象原始碼沒有獲取成功,則會引發OSError異常。

inspect.getsourcelines(obj)

參數同getsource()方法。它返回的原始碼作為行列表返回,行號指示原始源文件找到第一行代碼。如果無法檢索原始碼,則引發OSError異常。

inspect.getsourcefile(obj)

返回可用於定位對象源的文件名。如果無法識別獲取源,則返回None。

如何使用

上面3個方法如何使用呢?

如何使用?

我們還是使用前面自定義的demo模塊,如果沒有,請從《新手入門到進階,你不可不知的模塊,用Python獲取對象的詳細信息》一文中複製粘貼,或者粘貼下面的結果測試。

返回模塊原始碼

import inspect

import demo

print(inspect.getsource(demo))

>>>

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# Author:bob

# ProjectName : bowen

# DefaultFileName : demo.py

# User : Administrator

# Time : 2020/1/7 22:45

# IDEName : PyCharm

"""這是一個示例模塊,用於測試inspect模塊

"""

def module_level_function(arg1, arg2='default', *args, **kwargs):

"""這個函數是在模塊中定義的函數."""

local_variable = arg1 * 2

return local_variable

class A(object):

"""模塊中的自定義類A"""

def __init__(self, name):

self.name = name

def get_name(self):

"返回類的實例的名稱"

return self.name

instance_of_a = A('一個實例')

class B(A):

"""這是類B

它繼承自A類.

"""

# 這個方法是B類獨有的方法.

def do_something(self):

"""B類的實例提供的接口"""

pass

def get_name(self):

"重寫了A類的方法"

return 'B(' + self.name + ')'

成功獲取demo.py的原始碼。

成功返回

它不僅以字符串方式展現了類的原始碼,還保留了類中的縮進(博文中將縮進去除了,感興趣的小夥伴自己在編譯器中看)。這點很好,方便我們學習……

獲取類的原始碼

print(inspect.getsource(demo.A))

>>>

class A(object):

"""模塊中的自定義類A"""

def __init__(self, name):

self.name = name

def get_name(self):

"返回類的實例的名稱"

return self.name

成功返回類A的原始碼!

成功獲取

獲取方法的原始碼

print(inspect.getsource(demo.A.get_name))

>>>

def get_name(self):

"返回類的實例的名稱"

return self.name

上面代碼仍然是保留縮進的。

如果你試圖返回類的實例(比如demo.py中定義的instance_of_a)的原始碼,則會拋出TypeError異常。異常內容如下:

「TypeError: module, class, method, function, traceback, frame, or code object was expected, got A」

等等,這裡就不一一例舉了。下面來看下getsourcelines()方法有何不同

找出不同點

逐行返回getsourcelines()

print(inspect.getsourcelines(demo.A.get_name))

結果如下圖

getsourcelines()返回結果

使用

print(len(inspect.getsourcelines(demo.A.get_name)[0]))返回方法具體行數信息

print(inspect.getsourcelines(demo.A.get_name)[1])返回方法在模塊中的位置

這個功能對於讀取模塊中的內容很有用處,感興趣的小夥伴可以深入研究一下。

對於inspect.getsourcefile(obj)方法返回obj對象位置(字符串對象)

import os

import inspect

print(inspect.getsourcefile(os))

>>>

D:\ProgramData\Anaconda3\lib\os.py

你什麼時候如果想找原始碼讀讀,這個函數很有用哦!

很有用哦

都能獲得原始碼?

先不要高興得太早了,大家不要以為這個模塊什麼原始碼都可以獲取。其實不然,如下例:

import inspect

import os

print(inspect.getsource(os)[:10])

>>>

r"""OS rou

成功獲取,但是,如果要想知道其中某一方法的實現,就會拋出TypeError異常,如下

print(inspect.getsource(os.getcwd))

異常如下

>>>

TypeError: module, class, method, function, traceback, frame, or code object was expected, got builtin_function_or_method

意思是類型錯誤:需要模塊、類、方法、函數、回溯、幀或代碼對象,而我們傳入到函數中的是一個內置函數或方法(builtin_function_or_method)

結論

模塊、類、方法、函數、回溯、幀或代碼對象的原始碼可以通過inspect.getsource()或者inspect.getsourcelines()獲得,但是對於內置函數或方法我們無法通過這兩個函數獲取其原始碼內容。

好了,今天的內容就到這裡了,喜歡Python編程的小夥伴們試試看!還有什麼模塊能獲取到內置函數或方法的原始碼呢

轉載請註明出處,百家號:Python高手養成

相關焦點

  • python高階函數:map、filter、reduce的替代品
    什麼是高階函數?高階函數是一種將函數作為參數,或者把函數作為結果返回的函數,map函數、sorted函數就是高階函數的典型例子。map函數在小編以前的文章中做過相應的知識分享。sorted函數是python的內置函數,它的可選參數key用於提供一個函數,它可以將函數應用到各個元素上進行排序。
  • 一日一技:向Python中添加延遲函數time.sleep()
    sleep()命令是時間模塊的一部分。 當我們要暫時執行代碼時,可以使用sleep()函數。 例如,正在等待過程完成或文件上傳等。在本教程中,我們將學習:什麼是Python Sleep?示例:在Python中使用sleep()函數請按照以下給出的步驟在您的python腳本中添加sleep()。
  • python定時獲取天氣數據並自動發送到郵箱
    自動發送郵件,python幾行代碼來搞定!我們說到如何用python來實現自動發送郵件。這篇文章我們就來談談如何獲取天氣數據,並定時將天氣數據發送到指定的郵箱中?另一種是通過python爬取相關天氣預報網頁的內容,從裡面提取相關的信息。由於之前沒有給大家介紹過相關爬蟲的知識,所以這裡採用第一種方法。以後再陸續介紹爬蟲怎麼去獲取天氣預報信息。
  • 3種方法學會python模塊使用,3分鐘直接上手一個python繪圖程序
    turtle(小海龜)模塊具體的函數呢?三種查看模塊下具有哪些函數的方法:1、在python代碼編輯器中,使用模塊加"."號,就出現該模塊下所有的函數,也就是這個模塊下所有隱藏的技能2、第二種方式,在python shell控制臺上查看我們先 import turtle 導入模塊,然後,使用 dir(turtle) ,就顯示所有turtle下面具有的技能:
  • 寫Python 代碼不可不知的函數式編程技術
    近來,越來越多人使用函數式編程(functional programming)。因此,很多傳統的命令式語言(如 Java 和 Python)開始支持函數式編程技術。本文對 Python 中的函數式編程技術進行了簡單的入門介紹。本文適合對函數式編程有基本了解的讀者。
  • 利用運行按鈕,從模塊(Module)運行代碼
    「創建宏」一節說明了如何通過單擊命令按鈕來運行代碼,同時我們也提到利用一個自選圖形作為運行按鈕的實例,這章將講解一個實例代碼,放在標準模塊中,然後講解從模塊中運行代碼。1 打開Visual Basic編輯器我們在上面的章節中已經知道了如何打開一個Visual Basic編輯器了,這個編譯器我們俗稱為VBE窗口。
  • 實戰Python3.7+64位 Exe 反編譯
    python編譯後的二進位文件Python源碼編譯的結果就是PyCodeObject(簡稱「代碼對象」),每個作用域會編譯出一個對應的代碼對象,其中名為co_code的PyStringObject保存著代碼對象的字節碼。一個Python源文件就是一個模塊。
  • python教程之python數學運算
    中進行分數(fraction)運算分數運算是python中的一個模塊(module)。模塊是由別人寫的,並且可以被拿來直接使用的代碼程序,包括類、函數以及標籤的定義,是python標準函數庫的一部分。使用是必須先插入模塊。
  • 函數:python中的一等對象
    在python中,整數、字符串和字典都是一等對象,而下面我們介紹的是一等對象「函數」。將函數視作對象可以明確,python函數是對象。為什麼這麼說呢?我們下面來一一解答這個問題。檢查factorial的類型type(factorial) function通過factorial類型的檢查結果可知,factorial是function類的實例,而檢查方法,就如上述代碼所示,使用type()方法。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐
  • Python學習步驟
    易於維護:Python的成功在於它的原始碼是相當容易維護的。一個廣泛的標準庫:Python的最大的優勢之一是豐富的庫,跨平臺的,在UNIX,Windows和Macintosh兼容很好。互動模式:互動模式的支持,您可以從終端輸入執行代碼並獲得結果的語言,互動的測試和調試代碼片斷。
  • 微軟發布新的VS Code Python語言插件Pylance:高性能代碼提示
    Pylance這個名字源於對Monty Python的Lancelot的致敬,Lancelot亞瑟王圓桌武士中的第一位勇士。為了提供更好的VSC python開發的體驗,微軟基於Pyright靜態類型檢查工具基礎上,將Pylance創建為一種全新的語言伺服器。Pylance利用類型stubs(.pyi文件)和惰性類型推斷來提供高性能的開發體驗。
  • 逐步展開Python詳細教學—共享Python經驗
    在接下來的文章中,我們將討論一些有用的Python構造和Python的使用方法,以便讓您更好地了解Python代碼的結構。Python的結構體系(1) 函數(Function)Python中的函數是按名稱分組的語句集合。您可以在想一次執行所有這些語句時使用它。在程序中,你可以在任何地方調用它,次數不限。
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    熟悉python編程剛開始入門爬蟲,初學者無需學習python的類,多線程,模塊和其他稍微困難的內容。我們要做的是查找適合初學者的教科書或在線教程,並花費十多天的時間,您可以對python的基礎知識有三到四點了解,這時候你可以玩玩爬蟲了!
  • 慢步學習,python編程實例中,對遍歷程序結構for語句的解析
    第6行為引用python-docx庫內的Document模塊(python-docx庫的引用默認為docx,和庫設計有關,其他庫一般用庫名稱)。第8行,打開word文檔(123.docx),用變量d來指代打開的文檔,後面代碼中 d 就是我們這裡打開的123.docx。
  • 付費的知識星球要過期了,python 教你怎麼辦
    導入所需要的包準備資料庫把獲取的數據存入 MongoDB 中,為什麼選擇 MongoDB?準備資料庫分析知識星球的網絡請求數據用 Chrome 瀏覽器的開發者工具對知識星球 PC 端的網絡請求進行觀察,發現獲取星球話題的請求只有一個
  • Python編程中cx_freeze打包遇到的那些坑
    如何安裝?如何安裝,可以網上找文檔,但最關鍵的是:下載cx_Freezej時,一定要對應python版本。切記!!一定要根據自己的系統類型和Python版本下載合適的類型,類型稍微有不對應,就會不可理解的異常。我原來就是安裝了多個python版本,導致異常,最後把所有python刪除後,根據cx_freeze要求重新下載才沒有異常。
  • Python小夥用簡單爬蟲實現成語接龍小遊戲!
    話不多說,先上乾貨:開發前準備及思路:開發環境:python3.x模塊:requests,time,random,urllib,lxml #除了urllib模塊以外其餘模塊都需要安裝,pip可以解決url:http://chengyu.t086.com/先說一下成語接龍規則:1.接龍的成語的第一個字必須要與前一個成語結尾的字相同
  • Python - python爬蟲代碼微博 - CSDN
    前兩個import是加載Python的網絡編程模塊,後面的import是加載另兩個文件WeiboEncode.py和Weiboseach.py(稍後介紹)。主函數新建登陸對象,然後登陸。類內函數還有3個: 代碼示例:def Login(self):"登陸程序"self.EnableCookie(self.enableProxy)#cookie或代理伺服器配置serverTime, nonce, pubkey, rsakv = self.GetServerTime()#登陸的第一步postData =