python實(shí)現(xiàn)獲取文件中的類(lèi)方式
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)文章
Python基于jieba分詞實(shí)現(xiàn)snownlp情感分析
情感分析(sentiment analysis)是2018年公布的計(jì)算機(jī)科學(xué)技術(shù)名詞,它可以根據(jù)文本內(nèi)容判斷出所代表的含義是積極的還是負(fù)面的等。本文將通過(guò)jieba分詞實(shí)現(xiàn)snownlp情感分析,感興趣的可以了解一下2023-01-01
numpy多項(xiàng)式擬合函數(shù)polyfit的使用方法代碼
這篇文章主要給大家介紹了關(guān)于numpy多項(xiàng)式擬合函數(shù)polyfit的使用方法,np.polyfit是Numpy庫(kù)中的一個(gè)函數(shù),用于在最小二乘意義下擬合多項(xiàng)式曲線到數(shù)據(jù)點(diǎn)集,需要的朋友可以參考下2024-01-01
Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的最短路徑(Dijkstra算法)完整實(shí)例
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的最短路徑(Dijkstra算法),結(jié)合完整實(shí)例形式分析了Python圖的最短路徑算法相關(guān)原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12
python 調(diào)用API接口 獲取和解析 Json數(shù)據(jù)
這篇文章主要介紹了python 如何調(diào)用API接口 獲取和解析 Json數(shù)據(jù),幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-09-09
Python?pyecharts實(shí)時(shí)畫(huà)圖自定義可視化經(jīng)緯度熱力圖
這篇文章主要為大家介紹了Python?pyecharts實(shí)時(shí)畫(huà)圖自定義經(jīng)緯度熱力圖實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
pycharm跑python項(xiàng)目易出錯(cuò)的問(wèn)題總結(jié)
這篇文章主要介紹了pycharm跑python項(xiàng)目易出錯(cuò)問(wèn)題的相關(guān)資料,當(dāng)你在PyCharm中運(yùn)行Python程序時(shí)遇到報(bào)錯(cuò),可以按照以下步驟進(jìn)行排查和解決,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-09-09
Python reversed反轉(zhuǎn)序列并生成可迭代對(duì)象
這篇文章主要介紹了Python reversed反轉(zhuǎn)序列并生成可迭代對(duì)象,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10

