Python中循环导入的类

2024-04-19 00:22:53 发布

您现在位置:Python中文网/ 问答频道 /正文

出于多种原因,我发现自己处于导入许多python模块并希望遍历模块中每个类的位置。在

from capacity_hdd_parser import CapacityHDDParser
from capacity_ssd_parser import CapacitySSDParser
from checksum_parser import ChecksumParser
.
.
.

每个解析器都继承自一个基类,并且有一个我想在每个解析器上调用的方法

^{pr2}$

我的问题是,我有许多解析器要通过,我觉得必须有一种方法来动态迭代导入的类。每一个都要手工编写,这不仅是一件痛苦的事,而且会让我的代码在嘈杂声中更难看清。在


Tags: 模块方法fromimportparser解析器原因基类
3条回答

孩子们,不要在家里这样做:

parsers = [v for (k, v) in locals().items() 
             if k.endswith('Parser')]

你可以用更好的测试条件让它更安全一点。在

[更新]

Silas的声明性方法是安全的:

^{pr2}$

更好的是,您可以将PARSERSdict替换为config file。在

for Parser in get_registered_parsers():
    data = Parser().parse(logset_path)

通过任何必要的方法定义get_registered_parsers(),包括黑魔法,例如setuptools入口点,或yapsy (plugin architecture),或ABCs(显式register()函数)等

如果在全局命名空间中不需要它们,可以使用importlib.import_module。在

from importlib import import_module

for module_name, class_name in (('capacity_hdd_parser', 'CapacityHDDParser'),
                                ('capacity_ssd_parser', 'CapacitySSDParser'),
                                ('checksum_parser', 'ChecksumParser')):
    data_returned = getattr(import_module(module_name), class_name)().parse(logset_path)
    # Other processing here

您可能还需要考虑将解析器类合并到单个包中。这会使这种方法更加干燥,也可能更像Python。在Python中,每个文件一个类通常过于冗余/冗长。在

相关问题 更多 >