我有一个包含多个类的模块。一个类,比如 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/