国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python標準庫inspect的具體使用方法

2020-02-16 10:57:21
字體:
來源:轉載
供稿:網友

inspect模塊用于收集python對象的信息,可以獲取類或函數的參數的信息,源碼,解析堆棧,對對象進行類型檢查等等,有幾個好用的方法:

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.

這個模塊是針對模塊,類,方法,功能等對象提供些有用的方法。

getargspec(func)

返回一個命名元組ArgSpect(args, varargs, keywords, defaults),args是函數位置參數名列表,varargs是*參數名,keywords是**參數名,defaults是默認參數值的元組。

在用__init__參數自動初始化實例屬性的實踐中,是用字節碼對象的co_varnames屬性來獲取函數的位置參數名的:

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())

而當__init__方法使用**特殊參數接收任意數量的關鍵字參數時,上述代碼是不適用的。可行的辦法是使用字節碼的co_flags屬性來判斷**參數是否存在。

函數使用*args語法來接受任意數量的位置參數時,co_flags置位0x04,使用**kwargs語法時,置位0x08,函數為一個生成器時,置位0x2000,其它位保留:

>>> def foo(x, *args, **kwargv):  pass>>> foo.__code__.co_varnames('x', 'args', 'kwargv')>>> foo.__code__.co_flags & 0x044>>> foo.__code__.co_flags & 0x088

inspect模塊的getargspec()方法正是用此判斷來獲取函數的特殊參數的。現在可以方便的獲取__init__的**參數了:

import inspectdef 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__

結果為:

{'color': 'yellow', 'num': 1, 'name': 'bar'}

對象已經正確的初始化了。

getmembers(object[, predicate])

返回一個包含對象的所有成員的(name, value)列表。返回的內容比對象的__dict__包含的內容多,源碼是通過dir()實現的。

predicate是一個可選的函數參數,被此函數判斷為True的成員才被返回。

getmodule(object)

返回定義對象的模塊

getsource(object)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 翁牛特旗| 吉首市| 平凉市| 格尔木市| 禄劝| 资溪县| 扎鲁特旗| 北流市| 荃湾区| 洪雅县| 特克斯县| 邹城市| 祁连县| 荣成市| 南投县| 长寿区| 富阳市| 青海省| 曲阜市| 贵德县| 宁津县| 科尔| 白沙| 新营市| 彰化市| 贡山| 溧阳市| 蕉岭县| 开远市| 福海县| 华宁县| 罗江县| 栾川县| 常山县| 丘北县| 东阳市| 莱阳市| 长寿区| 历史| 深泽县| 永济市|