【问题标题】:Import vs C's #include导入与 C 的#include
【发布时间】:2010-01-22 05:18:58
【问题描述】:

在 C 中:

#include "foo.h"

int main()
{
}

我相信“foo.h”有效地被复制并粘贴在“#include”的位置。

我发现 Python 导入是不同的。

我刚刚重构了一些 GAE 代码,这些代码最初在一个大 index.py 文件中包含所有请求处理程序。

新目录树:

+ | +- [handlers] // 都继承 webapp.RequestHandler +- [models] // 全部继承 db.Model | +- globals.py // 包含站点范围设置的全局变量 +- index.py // 包含所有处理程序重定向

[handlers] 是包含处理程序的文件夹

[models] 是模型所在的文件夹

所以,index.py 去

from globals import *  # we need all of the globals

# ...

from handlers.FirstPage import FirstPage
from handlers.SecondPage import SecondPage
#.. etc.

不应 handlers.FirstPage 和 handlers.SecondPage “看到” 全局变量中的所有内容,因为全局变量是在处理程序之前“首先”导入的。*?

【问题讨论】:

  • 编写依赖于 C 的 #include 行为的代码基本上将代码复制并粘贴到文件中即使在 C 中也是不好的做法,当然它在 Python 中根本不起作用,因为这不是导入的内容做。如果 FirstPage 或 SecondPage 中的声明依赖于全局变量,它们应该自己导入全局变量。如果你是用 C 语言编写的,它们应该是#include'ing globals。

标签: python import


【解决方案1】:

虽然在 C 中它或多或少地“复制粘贴”代码,但在 Python 中则完全不同。

还记得 Python 之禅吗?

Explicit is better than implicit.
...
Namespaces are one honking great idea -- let's do more of those!

每次导入模块时,都会执行其代码,但会保留定义的所有范围。因此,当您导入handlers 时,您将授予index 访问globals 范围的权限,但handlers 模块无权访问globals 模块,除非您明确允许它访问范围并导入它。

【讨论】:

  • 每次导入模块时,都会执行其代码...。不完全正确。代码仅在首次导入时执行
【解决方案2】:

是的,它们首先被导入,但它们首先被导入 index.py。要“可见”globals 也需要在各自的文件中导入。

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 2023-02-11
    • 2018-10-20
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多