gpt4 book ai didi

python - 如何检查一个类是否已在同一模块中的另一个类中使用?

转载 作者:太空宇宙 更新时间:2023-11-04 04:00:17 25 4
gpt4 key购买 nike

我有一个包含多个类的模块。一个类,比如 A,依赖于另一个类,比如 B, A 有一个创建 B 的对象并使用它的方法。请注意,这里不涉及继承,只是 A 依赖 B 的简单事实。

我一直在使用名为 ModuleUseCollector 的自定义类,并访问源模块文件以检查某个模块是否已在另一个模块中使用。但是,我不知道如何检查一个类是否已在同一模块的另一个类中使用。

举一个最小可行的例子:

class CarPollutionPermit:
def __init__(self):
self.permit = False

def check_permit(self, year, mileage):
if year < 2016:
return False
if mileage > 15:
return True
return False


class BikePollutionPermit:
def __init__(self):
self.permit = True

def check_permit(self, year, mileage):
if year < 2010:
self.permit = False
return False
if mileage < 40:
if year > 2016:
return True
self.permit = False
return False
self.permit = True
return True


class TractorPollutionPermit:
def fetch_tractor(self, year, is_farmer):
if year > 2015 and is_farmer:
return True
if year > 2017:
return True
return False


class TractorPesticides(TractorPollutionPermit):
def fetch_pesticides_permit(self, pesticide_effect):
if pesticide_effect < 10:
if self.fetch_tractor(2019, True):
return True
return False
car_pollution_permit = CarPollutionPermit()
return (car_pollution_permit.check_permit(2019, 16))

如您所见,TractorPesticides 类依赖于 CarPollutionPermit。我必须提取这种关系。代码库是 Python3 的,我执行此功能的代码也在 Python3 中。

最佳答案

您需要使用 abstract syntax tree你的模块。至少适用于您的模块并显示 TractorPesticides 依赖于 CarPollutionPermit 的示例:

import ast


with open('test.py') as f:
data = f.read()
module = ast.parse(data)
classes = [
obj
for obj in module.body
if isinstance(obj, ast.ClassDef)
]
class_names = [obj.name for obj in classes]
dependencies = {name: [] for name in class_names}
for cls in classes:
for node in ast.walk(cls):
if isinstance(node, ast.Call):
if isinstance(node.func, ast.Name):
if node.func.id != cls.name and node.func.id in class_names:
dependencies[cls.name].append(node.func.id)
for class_name, dependency in dependencies.items():
print(class_name, dependency)

输出:

CarPollutionPermit []
BikePollutionPermit []
TractorPollutionPermit []
TractorPesticides ['CarPollutionPermit']

关于python - 如何检查一个类是否已在同一模块中的另一个类中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58489042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com