gpt4 book ai didi

python - 收集python模块中的一些特定类

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:54 28 4
gpt4 key购买 nike

我有一个包含类C1、C2、CInvalid3、C4的包,它们在不同的子模块中定义。

my_package/
__init__.py
sub_package1/
__init__.py
sub_module1.py # contains C1, C2
sub_package2/
__init__.py
sub_module2.py # contains CInvalid3, C4

给定一个包含某个类名称的字符串,我想初始化相应的类。例如,

some_valid_class_name = 'C1'
some_valid_class = all_valid_classes[some_valid_class_name]()

目前我在my_package下创建了一个模块all_classes.py,其中包含

all_valid_classes = {} # I want the dict contain C1, C2 and C4

def this_is_a_valid_class(cls):
all_valid_classes[cls.__name__] = cls
return cls

sub_module1.pysub_module2.py 中,我使用

from my_package.all_classes import this_is_a_valid_class

@this_is_a_valid_class
class C1(object):
pass

并添加

from .sub_package1 import sub_module1
from .sub_package2 import sub_module2

my_package/__init__.py

有没有更好的方法来处理这个问题?我导入 my_package/__init__.py 中的所有内容。当我添加新的 sub_package3.sub_module3.C99 时,我需要记住将 from .sub_package3 import sub_module3 添加到 my_package/__init__.py 。我认为这些都不是好主意。

最佳答案

要获得您正在寻找的内容,您可以做的是使用类属性标记有效的类:

class C1(object):
_valid = True

然后动态导入包中的所有模块,在此过程中将有效类单独存储在 all_valid_classes 字典中。

关键是,无论如何,您都必须导入要使用的所有类的模块,因此您可以手动(就像您现在所做的那样)或动态(在其中查找模块的文件名)包并导入它们)。

这段代码展示了这个概念(请注意,它真的很丑陋,仅用作概念验证,我匆忙组装了它!)。它将进入您的 my_module/__init__.py 文件:

import os
import fnmatch
from importlib import import_module
from types import TypeType

# dictionary with all valid classes
all_valid_classes = {}

# walk directory and load modules dynamically
this_path = os.path.dirname(__file__)
modules = []
for root, dirnames, filenames in os.walk(this_path):
for filename in fnmatch.filter(filenames, '*.py'):

# avoid this file importing itself
full_path = os.path.join(root, filename)
if full_path == os.path.join(this_path, '__init__.py'):
continue

# convert the filename to the module name
trimmed_path = full_path[len(this_path) + 1:-3]
module_name = trimmed_path.replace('/', '.')

# import the module
module = import_module('%s.%s' % (__name__, module_name))

# find valid classes (classes with a '_valid = True' attribute
for item_name in dir(module):
item = getattr(module, item_name)
if type(item) == TypeType:
try:
valid_attr = getattr(item, '_valid')
if valid_attr is True:
all_valid_classes[item_name] = item
except AttributeError:
pass

导入my_module后,all_valid_classes将包含C1C2C4 (前提是它们标有 _valid = True)。

ps。但请注意,我个人会像您一样手动进行导入,在我看来,它更加Pythonic和干净。

关于python - 收集python模块中的一些特定类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39209891/

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