最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)獲取文件中的類(lèi)方式

 更新時(shí)間:2025年12月31日 09:26:16   作者:我一個(gè)搬磚人  
本文介紹了兩種獲取Python文件中類(lèi)的方法:一種是通過(guò)導(dǎo)入文件,另一種是通過(guò)不導(dǎo)入文件獲取類(lèi)名,不導(dǎo)入文件的方法通過(guò)解析抽象語(yǔ)法樹(shù)(AST)并使用正則表達(dá)式來(lái)過(guò)濾出特定類(lèi)名,從而避免了全量導(dǎo)入帶來(lái)的問(wèn)題

1. 導(dǎo)入文件的方式獲取文件中的類(lèi)

由于工作需求,需要獲得文件中的某一些類(lèi)的內(nèi)容。

一般比較常用的方法是通過(guò)遍歷文件,然后通過(guò)調(diào)用importlib包導(dǎo)入文件,就能獲得文件中的內(nèi)容,從而獲取想要的類(lèi)。

代碼如下:

for importer, package_name, is_pkg in pkgutil.walk_packages('.'):
	importlib.import_module(package_name)
	module = sys.modules[package_name]

	for cls_name, cls in inspect.getmembers(module, inspect.isclass):
		if is_want_class(cls):  
			do_something()

該方法十分簡(jiǎn)單,但是也有弊端。由于需要導(dǎo)入文件,因此文件中的內(nèi)容都會(huì)被執(zhí)行。而在一個(gè)項(xiàng)目中,存在著成百上千的文件,有一些代碼是相斥的。

如果通過(guò)這種方法獲取類(lèi),輕則出現(xiàn)邏輯問(wèn)題,重則出現(xiàn)異常,報(bào)錯(cuò)。

2. 通過(guò)不導(dǎo)入文件的方式獲取文件中的類(lèi)名,從而過(guò)濾文件

為了防止上面說(shuō)到的問(wèn)題影響項(xiàng)目,我們不能將所有文件通通導(dǎo)入進(jìn)來(lái)。

但是換個(gè)思路,可以先通過(guò)不導(dǎo)入文件的方式獲取文件中中存在的類(lèi)名,如果存在的類(lèi)名中有想要獲取的類(lèi),再導(dǎo)入文件。通過(guò)這種方式避免導(dǎo)入所有文件,從而大大降低出錯(cuò)的可能性。

我們知道,python解釋器在運(yùn)行時(shí)候,對(duì)文件做了下列操作:

Parse source code into a parse tree (Parser/pgen.c)
Transform parse tree into an Abstract Syntax Tree (Python/ast.c)
Transform AST into a Control Flow Graph (Python/compile.c)
Emit bytecode based on the Control Flow Graph (Python/compile.c)

其中1,2步執(zhí)行之后,會(huì)生成一棵抽象語(yǔ)法樹(shù),從而幫助解釋器去解析代碼結(jié)構(gòu)。 

因此想要獲得文件中的類(lèi),可以通過(guò)ast包獲得生成的ast樹(shù),再通過(guò)遍歷樹(shù)節(jié)點(diǎn)的方式獲得相應(yīng)的內(nèi)容。通過(guò)該方法,可以獲得定義的變量和類(lèi)名的文本信息。

在項(xiàng)目代碼中,一般對(duì)于類(lèi)的命名有特定的規(guī)范。因此需要正則表達(dá)式,可以過(guò)濾出文件中是否含有想要查找的類(lèi)。

代碼如下:

for root, dirs, files in os.walk("."):
	for file in files:
	    file_name = os.path.join(root, file)

	    with open(file_name, "r") as source:
                    # 將文件轉(zhuǎn)化為ast樹(shù)
                tree = ast.parse(source.read())
                # 獲取樹(shù)中的類(lèi)
                class_name_list = [node.name for node in ast.walk(tree) if isinstance(node, ast.ClassDef)]
                # 這里通過(guò)正則want_pattern去匹配類(lèi),從而過(guò)濾出想要的類(lèi)
                want_class_name_list = [name for name in class_name_list if re.search(want_pattern, name) is not None]

最后得到的want_class_name_list就是通過(guò)正則匹配出來(lái)的類(lèi)的類(lèi)名。通過(guò)判斷want_class_name_list是否為空,就能知道文件中是否定義了自己想要的類(lèi)。

如果定義了,再用方法1獲取文件中的類(lèi)即可。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

邳州市| 周口市| 新民市| 遂平县| 乐昌市| 八宿县| 南宫市| 陈巴尔虎旗| 合水县| 南通市| 上虞市| 开平市| 永靖县| 定结县| 尼玛县| 博客| 康马县| 三亚市| 东兰县| 沈丘县| 姜堰市| 江源县| 牙克石市| 阳城县| 阿拉尔市| 顺平县| 河津市| 长宁县| 徐汇区| 景泰县| 石河子市| 内黄县| 彩票| 灵武市| 项城市| 威宁| 明溪县| 丁青县| 安新县| 武夷山市| 洛川县|