【问题标题】:Proper way to use nested modules使用嵌套模块的正确方法
【发布时间】:2016-09-18 17:30:34
【问题描述】:

我将一个程序分成三个脚本。其中之一,“classes.py”,是一个定义我需要的所有类的模块。另一个是一种设置模块,称为“setup.py”,它从“classes.py”实例化很多对象(它只是一堆变量赋值,带有一些for循环,没有函数或类)。当我在处理程序本身的第三个脚本时,它有很多字符串和我不想看到的东西,即实际上与上述所有内容一起做某事的脚本。

我让它工作的唯一方法是在“setup.py”脚本中添加:

from classes import *

这使我可以在安装文件中快速写入,而无需在任何地方添加命名空间。而且,在主脚本中:

import setup

这具有 PyCharm 的优点,可以为类和方法提供完整的代码完成,这很好。

我想要实现的是让主脚本导入类,然后使用两个简单的命令运行设置脚本来创建我需要的对象。但是我无法将类脚本导入主脚本,因为安装脚本无法做任何事情,没有类定义。我应该将类导入两个脚本,还是完全做其他事情?

【问题讨论】:

  • 对不起,为什么将classes 模块导入主脚本意味着设置无法执行任何操作?
  • 是的,所有内容都应该在各自的文件中导入。

标签: python python-3.x


【解决方案1】:

在每个文件中导入。考虑this SO post。从那里的Fooz先生的回答中,

每个模块都有自己的命名空间。所以 boo.py 要从外部模块中看到某些东西,boo.py 必须自己导入它。

可以编写一种语言,其中命名空间按照您期望的方式堆叠:这称为动态范围。一些语言,如原始 lisp、早期版本的 perl、postscript 等确实使用(或支持)动态范围。

大多数语言都使用词法作用域。事实证明,这是一种更好的语言工作方式:这样一个模块可以根据自己的代码推断它是如何工作的,而不必担心它是如何被调用的。

有关更多详细信息,请参阅本文:http://en.wikipedia.org/wiki/Scope_%28programming%29

直观上感觉也更好,因为您可以立即(在文件本身中)查看代码具有哪些依赖项 - 这将使您在一个月甚至一年后更好地理解您的代码。

【讨论】:

  • 感谢您的回答和 SO 帖子。现在看来合乎逻辑:一年后,我阅读脚本 C,看到它导入了 B,然后我阅读了 B,发现它导入了 A。我只是不确定这是一个养成的好习惯 :) 非常感谢。
猜你喜欢
  • 2022-07-26
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
相关资源
最近更新 更多