2

我遇到了一个可能很基本的问题,但作为一名 Python 学习者,我已经为此苦苦挣扎了好几个小时。到目前为止,该文档尚未为我提供答案。

问题是当我从 python 脚本导入这个模块时,模块中包含的导入语句似乎没有被执行。我所拥有的如下:

我有一个文件 project.py(即 python 库),如下所示:

import datetime

class Project:
    """ This class is a container for project data """

    title        = ""
    manager      = ""
    date         = datetime.datetime.min

    def __init__( self, title="", manager="", date=datetime.datetime.min ):
    """ Init function with some defaults """

        self.title        = title
        self.manager      = manager
        self.date         = date

该库稍后在导入项目的脚本 ( file.py) 中使用,它的开头如下:

import project

print datetime.datetime.min

当我尝试使用 Python 执行此脚本时,就会出现问题file.py。然后 Python 抱怨以下 NameError:

Traceback (most recent call last):
  File "file.py", line 3, in <module>
    print datetime.datetime.min
NameError: name 'datetime' is not defined

如果我尝试直接从 Python shell发出相同的语句(import和),这实际上也会发生。print

模块不应该datetime在我调用的那一刻自动导入import project吗?

提前非常感谢。

4

2 回答 2

4

datetime模块仅导入到project命名空间中。所以你可以访问它project.datetime.datetime.min,但实际上你应该直接将它导入到你的脚本中。

project.py您在文件(如您的类)中创建的每个符号(名称)Project最终都在project命名空间中,其中包括您从其他模块导入的内容。然而,这并不像看起来那么低效 - 实际datetime模块仍然只导入一次,无论您执行多少次。每次您在第一个之后导入它时,它只是将名称导入当前命名空间,但实际上并没有完成读取和导入模块的所有繁重工作。

于 2011-02-25T08:12:11.680 回答
0

尝试将import语句大致等同于:

project = __import__('project')

实际上,import语句只是对变量的赋值。加载模块时可能会产生一些副作用,但在脚本内部,您所看到的只是对名称的简单分配。

您可以使用 提取模块中的所有名称from project import *,但不要这样做,因为它会使您的代码更脆弱且更难维护。相反,要么只导入模块,要么完全导入您想要的名称。

因此,对于您的代码,例如:

import datetime
from project import Project

是你应该做的事情。

于 2011-02-25T08:26:27.050 回答