我遇到的问题可能是一个非常基本的问题,但作为一名Python学习者,我一直在努力工作几个小时。到目前为止,文档还没有给我答案。
问题是当我从python脚本导入此模块时,似乎没有执行模块中包含的import语句。我所拥有的如下:
我有一个文件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
的确切时刻自动导入?
提前多多感谢。
答案 0 :(得分:4)
datetime
模块仅导入project
命名空间。所以可以以project.datetime.datetime.min
的形式访问它,但实际上您应该直接将其导入到脚本中。
您在project.py
文件中创建的每个符号(名称)(如Project
类)最终都在project
命名空间中,其中包含从其他模块导入的内容。但这并不像看起来那么低效 - 实际的datetime
模块仍然只导入一次,无论你做多少次。每次在第一个之后导入它时,它只是将 names 导入当前命名空间,但实际上并没有完全解读和导入模块。
答案 1 :(得分:0)
尝试将import
语句视为大致相当于:
project = __import__('project')
有效地,import
语句只是对变量的赋值。加载模块时可能会有一些副作用,但是从脚本内部看到的只是对名称的简单赋值。
您可以使用from project import *
从模块中提取所有名称,但不要这样做,因为它会使您的代码更脆弱,更难维护。相反,要么只是导入模块,要么只是导入你想要的名称。
因此对于您的代码类似:
import datetime
from project import Project
是你应该做的事情。