如何在不改变程序结构的情况下将大python文件分割成小文件

问题描述 投票:0回答:1

我面临如下程序:

class A:
    def __init__(self) -> None:
        pass
        
    def check(self, element):
        if element == 'TypeA':
            self.__validate_TypeA(element)
        if element == 'TypeB':
            self.__validate_TypeB(element)
        if element == 'TypeC':
            self.__validate_TypeC(element)
    
    def __validate_TypeA(self, element):
        # implementation..
        if element.contains('TypeB'):
            self.check('TypeB')
        # implementation...
    def __validate_TypeB(self, element):
        if element.contains('TypeC'):
            self.check('TypeC')
    def __validate_TypeC(self, element):
        if element.contains('TypeA'):
            self.check('TypeA')

    # thousands of codes here...

在这个类中,方法之间是相互依赖的;在我的项目中,有像“TypeA”、“TypeB”这样的半百个类型,它们是相互关联的,并且可能在自己的实现中调用

check
方法;现在我的类增长到 4000 行代码,维护变得很棘手。

我尝试过使用继承,但没有成功; 我尝试过使用内置的 exec(),但它会强制将代码分成多个文件,失去使用 IDE 进行代码突出显示等的可能性...

那么有没有办法做到以下几点呢? :

  1. 将我的类分成多个文件,可能一个文件用于一种类型实现
  2. 不影响程序结构

在C/C++中,这可以使用#include轻松完成,我不知道如何在Python中做到这一点。

python
1个回答
0
投票

我会给你一些想法,但你会遇到麻烦 - 如果那是“现实世界”相关的,我建议聘请 Python 咨询专家几个小时。

只是为了采纳您的建议:在这种情况下不要使用

exec
eval
- 不是出于安全原因,它只是很脏。

第三件事,在不改变项目结构的情况下将一个大的Python文件包含在文件中的多个函数或类中很容易在Python中完成:对于每个大的“something.py”文件,只需创建一个“something”目录,在其中创建一个

 __init__.py
文件,将从该目录中的子模块导入大文件中先前的函数和类,并将每个函数组或每个类放在同一
something
目录内的不同文件中。任何使用
something.py
模块的代码都可以工作

但是,你想细分classess!你不能简单地将一个类分割成不同的文件。

(好吧,如果确实需要的话,可以这样做 - 创建一些代码来读取在子模块顶层声明为函数的方法,并修补基类以合并所有这些方法会很容易。但是您不需要这样做,并且流行的 Python 静态工具根本无法理解它)

然后,最后,进行元编程并改进代码:

C/C++ 源代码只是“死字符串”,这就是为什么仅执行盲目“粘贴”操作的“#include”起作用的原因。 Python 代码是“实时”的 - 每个表达式确实具有运行时效果 - 无论是执行、添加还是创建新类

啊...第四件事:不要仅仅因为您在此处阅读了它构成“私有属性”的内容而滥用

__
前缀。是的,它的工作方式基本上是相同的,但是私有属性的思考方式并不是 Python 编码的方式。 Python 不是 C++ 或 Java,默认情况下东西是公共的是有原因的:它更简单且更具可读性。以这种方式使用私有属性只会否定继承的一些好处。

所以,我不知道你的示例代码与你那里的代码有多接近,但如果它像that,那么看起来你需要对属性进行一些递归验证。这将需要大约 10-20 行代码,无论您可能有多少个“typeA”、“typeB”、“typeC”等……彼此内部的类。

所以我给你的最后一个提示是:你可以通过将属性或方法名称作为字符串来获取类中的属性和方法 - 只需使用

getattr
内置函数。如果你的代码是这样的,如果做得正确的话,仅此一项就可以为每个文件节省数千行。

抱歉,只有这个示例代码,我无法提供更多帮助。如果代码不是那么重复并且您无法重构它 - 则存在“好吧,如果确实需要的话可以完成”因素。 Python 专家可以在配对代码实时会话中一目了然地告诉您执行此操作的最佳方法,但不能通过此处的下采样示例来实现。

啊,顺便说一句,我是否提到过,如果您只删除方法的

__
前缀,继承就会起作用? (嗯,很可能会。您没有提到继承的哪一部分“不起作用”)

© www.soinside.com 2019 - 2024. All rights reserved.