【问题标题】:Is there an easy way to treat multiple files as a single script?有没有一种简单的方法可以将多个文件视为一个脚本?
【发布时间】:2017-07-01 15:37:52
【问题描述】:

我正在编写一个 Python 程序(使用 Pycharm),其中大约一半的代码被类和函数占用。该程序现在很长,并且写在一个文件中。 如果我可以将类、函数和其余代码分成 3 个单独的文件,将会节省大量时间。目前,由于循环导入,我无法执行此操作,这导致“from FunctionDocument import *”语句在写入主文档时不起作用。

我知道循环导入是不专业且不推荐的。但对我来说,为什么不能简单地添加一两行来指示 Python 将 3 个单独的文件视为全部编写在一个单独的文件中是不可能的 - 即使它们相互依赖也是如此。

我知道这可以通过重写代码使其成为非循环来解决,并且创建虚拟环境也可以解决问题。但是真的没有别的办法了吗?

【问题讨论】:

  • 为什么你认为循环进口是唯一的方法?
  • 你看过this other question的答案了吗?它是搜索“python 循环导入”的首批结果之一,其中包含支持和反对循环导入的各种意见。 (嗯,不完全是 for,但至少不那么重要)。我链接到的具体答案解释了一些可能对您的情况有所帮助的循环导入流程。
  • 你总是可以编写一个实用程序,在文件运行之前将它们粘在一起......我也很感兴趣,如果 Python 可以自己做到这一点
  • 您可以将文件连接在一起并将结果提供给 Python 解释器。如何做到这一点取决于您的操作系统。在 Windows 上,在命令提示符下,您可以使用 type script1.py script2.py > temp.py & python temp.py。基于 Unix 的操作系统有更优雅的方式来做同样的事情。

标签: python import circular-reference


【解决方案1】:

如果您有循环引用,则您的解决方案设计可能存在潜在问题。我的建议是模块化您的设计。

您不应考虑将代码划分为任意数量的文件(例如 3 个),而是创建模块文件夹,分隔 __init__.py 文件以初始化每个模块并为每个类分隔文件。起初,拥有许多小文件似乎很麻烦,但您很快就会发现这种方法的可维护性如何。

重新分级循环依赖,你可能会遇到类之间的依赖问题。类不应相互依赖。依赖关系应该是单向的。例如,Dog 可以通过扩展来依赖于 Animal。但是 Animal 不能引用 Dog 类。这并不意味着它不能与之合作。例如,通过使用在 Dog 类中定义的方法。

减少类之间依赖关系的主要工具之一是duck typing。您无需导入类即可使用其方法。如果对象作为参数传递给方法,您可以在不知道其类的情况下向该对象发送消息。

This 是一篇关于构建 Python 项目的好文章。如果您遵循这种方法,您会很快发现代码清晰度和生产力都有所提高。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 2012-02-25
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多