python實現(xiàn)獲取文件中的類方式
1. 導(dǎo)入文件的方式獲取文件中的類
由于工作需求,需要獲得文件中的某一些類的內(nèi)容。
一般比較常用的方法是通過遍歷文件,然后通過調(diào)用importlib包導(dǎo)入文件,就能獲得文件中的內(nè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()
該方法十分簡單,但是也有弊端。由于需要導(dǎo)入文件,因此文件中的內(nèi)容都會被執(zhí)行。而在一個項目中,存在著成百上千的文件,有一些代碼是相斥的。
如果通過這種方法獲取類,輕則出現(xiàn)邏輯問題,重則出現(xiàn)異常,報錯。
2. 通過不導(dǎo)入文件的方式獲取文件中的類名,從而過濾文件
為了防止上面說到的問題影響項目,我們不能將所有文件通通導(dǎo)入進(jìn)來。
但是換個思路,可以先通過不導(dǎo)入文件的方式獲取文件中中存在的類名,如果存在的類名中有想要獲取的類,再導(dǎo)入文件。通過這種方式避免導(dǎo)入所有文件,從而大大降低出錯的可能性。
我們知道,python解釋器在運行時候,對文件做了下列操作:
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í)行之后,會生成一棵抽象語法樹,從而幫助解釋器去解析代碼結(jié)構(gòu)。
因此想要獲得文件中的類,可以通過ast包獲得生成的ast樹,再通過遍歷樹節(jié)點的方式獲得相應(yīng)的內(nèi)容。通過該方法,可以獲得定義的變量和類名的文本信息。
在項目代碼中,一般對于類的命名有特定的規(guī)范。因此需要正則表達(dá)式,可以過濾出文件中是否含有想要查找的類。
代碼如下:
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樹
tree = ast.parse(source.read())
# 獲取樹中的類
class_name_list = [node.name for node in ast.walk(tree) if isinstance(node, ast.ClassDef)]
# 這里通過正則want_pattern去匹配類,從而過濾出想要的類
want_class_name_list = [name for name in class_name_list if re.search(want_pattern, name) is not None]最后得到的want_class_name_list就是通過正則匹配出來的類的類名。通過判斷want_class_name_list是否為空,就能知道文件中是否定義了自己想要的類。
如果定義了,再用方法1獲取文件中的類即可。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python基于jieba分詞實現(xiàn)snownlp情感分析
情感分析(sentiment analysis)是2018年公布的計算機科學(xué)技術(shù)名詞,它可以根據(jù)文本內(nèi)容判斷出所代表的含義是積極的還是負(fù)面的等。本文將通過jieba分詞實現(xiàn)snownlp情感分析,感興趣的可以了解一下2023-01-01
numpy多項式擬合函數(shù)polyfit的使用方法代碼
這篇文章主要給大家介紹了關(guān)于numpy多項式擬合函數(shù)polyfit的使用方法,np.polyfit是Numpy庫中的一個函數(shù),用于在最小二乘意義下擬合多項式曲線到數(shù)據(jù)點集,需要的朋友可以參考下2024-01-01
Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的最短路徑(Dijkstra算法)完整實例
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的最短路徑(Dijkstra算法),結(jié)合完整實例形式分析了Python圖的最短路徑算法相關(guān)原理與實現(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實時畫圖自定義可視化經(jīng)緯度熱力圖
這篇文章主要為大家介紹了Python?pyecharts實時畫圖自定義經(jīng)緯度熱力圖實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Python reversed反轉(zhuǎn)序列并生成可迭代對象
這篇文章主要介紹了Python reversed反轉(zhuǎn)序列并生成可迭代對象,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10

