Python標(biāo)準(zhǔn)庫(kù)inspect的具體使用方法
inspect模塊用于收集python對(duì)象的信息,可以獲取類或函數(shù)的參數(shù)的信息,源碼,解析堆棧,對(duì)對(duì)象進(jìn)行類型檢查等等,有幾個(gè)好用的方法:
Doc:這樣寫到
The inspect module provides several useful functions to help get information about live objects such as modules, classes, methods, functions, tracebacks, frame objects, and code objects.
這個(gè)模塊是針對(duì)模塊,類,方法,功能等對(duì)象提供些有用的方法。
getargspec(func)
返回一個(gè)命名元組ArgSpect(args, varargs, keywords, defaults),args是函數(shù)位置參數(shù)名列表,varargs是*參數(shù)名,keywords是**參數(shù)名,defaults是默認(rèn)參數(shù)值的元組。
在用__init__參數(shù)自動(dòng)初始化實(shí)例屬性的實(shí)踐中,是用字節(jié)碼對(duì)象的co_varnames屬性來(lái)獲取函數(shù)的位置參數(shù)名的:
def attr_from_locals(locals_dict): self = locals_dict.pop('self') code = self.__init__.__func__.__code__ args = code.co_varnames[1:code.co_argcount] for k in args: setattr(self, k, locals_dict[k]) class Foo(object): def __init__(self, name, color, num=1): x = 1 attr_from_locals(locals())
而當(dāng)__init__方法使用**特殊參數(shù)接收任意數(shù)量的關(guān)鍵字參數(shù)時(shí),上述代碼是不適用的??尚械霓k法是使用字節(jié)碼的co_flags屬性來(lái)判斷**參數(shù)是否存在。
函數(shù)使用*args語(yǔ)法來(lái)接受任意數(shù)量的位置參數(shù)時(shí),co_flags置位0x04,使用**kwargs語(yǔ)法時(shí),置位0x08,函數(shù)為一個(gè)生成器時(shí),置位0x2000,其它位保留:
>>> def foo(x, *args, **kwargv): pass >>> foo.__code__.co_varnames ('x', 'args', 'kwargv') >>> foo.__code__.co_flags & 0x04 4 >>> foo.__code__.co_flags & 0x08 8
inspect模塊的getargspec()方法正是用此判斷來(lái)獲取函數(shù)的特殊參數(shù)的?,F(xiàn)在可以方便的獲取__init__的**參數(shù)了:
import inspect def attr_from_locals(locals_dict): self = locals_dict.pop('self') args = inspect.getargspec(self.__init__.__func__).args[1:] for k in args: setattr(self, k, locals_dict[k]) keywords = inspect.getargspec(self.__init__.__func__).keywords if keywords: keywords_dict = locals_dict[keywords] for k in keywords_dict: setattr(self, k, keywords_dict[k]) class Foo(object): def __init__(self, name, **kwargv): attr_from_locals(locals()) f = Foo('bar', color='yellow', num=1) print f.__dict__
結(jié)果為:
{'color': 'yellow', 'num': 1, 'name': 'bar'}
對(duì)象已經(jīng)正確的初始化了。
getmembers(object[, predicate])
返回一個(gè)包含對(duì)象的所有成員的(name, value)列表。返回的內(nèi)容比對(duì)象的__dict__包含的內(nèi)容多,源碼是通過(guò)dir()實(shí)現(xiàn)的。
predicate是一個(gè)可選的函數(shù)參數(shù),被此函數(shù)判斷為True的成員才被返回。
getmodule(object)
返回定義對(duì)象的模塊
getsource(object)
返回對(duì)象的源代碼
getsourcelines(object)
返回一個(gè)元組,元組第一項(xiàng)為對(duì)象源代碼行的列表,第二項(xiàng)是第一行源代碼的行號(hào)
ismodule,isclass,ismethod,isfunction,isbuiltin
一系列判斷對(duì)象類型的方法,大都是包裝了isinstance(object, types.FunctionType)之類語(yǔ)句的函數(shù)。
現(xiàn)在可以用類型判斷來(lái)返回一個(gè)類的方法了:
class Foo(object): '''Foo doc''' def __init__(self, name): self.__name = name def getname(self): return self.__name inspect.getmembers(Foo, inspect.ismethod)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Django自關(guān)聯(lián)實(shí)現(xiàn)多級(jí)聯(lián)動(dòng)查詢實(shí)例
這篇文章主要介紹了Django自關(guān)聯(lián)實(shí)現(xiàn)多級(jí)聯(lián)動(dòng)查詢實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Python實(shí)戰(zhàn)爬蟲(chóng)之女友欲買文胸不知何色更美
實(shí)踐來(lái)源于理論,做爬蟲(chóng)前肯定要先了解相關(guān)的規(guī)則和原理,網(wǎng)絡(luò)爬蟲(chóng)又稱為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò)機(jī)器人,更經(jīng)常的稱為網(wǎng)頁(yè)追逐者,是一種按照一定的規(guī)則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本。一句話概括就是網(wǎng)上信息搬運(yùn)工。本篇文章帶你深入了解,需要的朋友可以參考下2021-09-09Django對(duì)models里的objects的使用詳解
今天小編就為大家分享一篇Django對(duì)models里的objects的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08Python使用pyenv實(shí)現(xiàn)多環(huán)境管理
這篇文章主要介紹了Python使用pyenv實(shí)現(xiàn)多環(huán)境管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02ansible動(dòng)態(tài)Inventory主機(jī)清單配置遇到的坑
這篇文章主要介紹了ansible動(dòng)態(tài)Inventory主機(jī)清單配置遇到的坑,需要的朋友可以參考下2020-01-01Numpy 將二維圖像矩陣轉(zhuǎn)換為一維向量的方法
今天小編就為大家分享一篇Numpy 將二維圖像矩陣轉(zhuǎn)換為一維向量的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python中用函數(shù)作為返回值和實(shí)現(xiàn)閉包的教程
這篇文章主要介紹了Python中用函數(shù)作為返回值和實(shí)現(xiàn)閉包的教程,代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04對(duì)Python 窗體(tkinter)文本編輯器(Text)詳解
今天小編就為大家分享一篇對(duì)Python 窗體(tkinter)文本編輯器(Text)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10使用 Python 實(shí)現(xiàn)簡(jiǎn)單的 switch/case 語(yǔ)句的方法
這篇文章主要介紹了用 Python 實(shí)現(xiàn)簡(jiǎn)單的 switch/case 語(yǔ)句的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09python的去重以及數(shù)據(jù)合并的用法說(shuō)明
這篇文章主要介紹了python的去重以及數(shù)據(jù)合并的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02