Python標(biāo)準(zhǔn)庫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屬性來獲取函數(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í),上述代碼是不適用的。可行的辦法是使用字節(jié)碼的co_flags屬性來判斷**參數(shù)是否存在。
函數(shù)使用*args語法來接受任意數(shù)量的位置參數(shù)時(shí),co_flags置位0x04,使用**kwargs語法時(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()方法正是用此判斷來獲取函數(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)容多,源碼是通過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)之類語句的函數(shù)。
現(xiàn)在可以用類型判斷來返回一個(gè)類的方法了:
class Foo(object): '''Foo doc''' def __init__(self, name): self.__name = name def getname(self): return self.__name inspect.getmembers(Foo, inspect.ismethod)
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python關(guān)于多值參數(shù)的實(shí)例詳解
在本篇內(nèi)容里小編給大家整理了一篇關(guān)于python關(guān)于多值參數(shù)的實(shí)例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-07-07
利用Python的Twisted框架實(shí)現(xiàn)webshell密碼掃描器的教程
這篇文章主要介紹了利用Python的Twisted框架實(shí)現(xiàn)webshell密碼掃描器的教程,用到了Twisted框架的異步通信機(jī)制,需要的朋友可以參考下2015-04-04
Python中使用Boolean操作符做真值測(cè)試實(shí)例
這篇文章主要介紹了Python中使用Boolean操作符做真值測(cè)試實(shí)例,在Python中,任何類型的對(duì)象都可以做真值測(cè)試,并且保證返回True或者False,需要的朋友可以參考下2015-01-01
Python安裝Scrapy庫的常見報(bào)錯(cuò)解決
本文主要介紹了Python安裝Scrapy庫的常見報(bào)錯(cuò)解決,文中通過圖文示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
深入解析Python中函數(shù)的參數(shù)與作用域
這篇文章主要介紹了Python中函數(shù)的參數(shù)與作用域,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-03-03
python實(shí)現(xiàn)銀聯(lián)支付和支付寶支付接入
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)銀聯(lián)支付和支付寶支付的接入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
Python實(shí)現(xiàn)按鍵精靈版的連點(diǎn)器
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)按鍵精靈版的連點(diǎn)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-06-06

