import模块与from模块import *有什么区别?
我在学习Django教程时遇到了一些问题,所以在这里提了个问题。 没有人知道答案,但我最终在Robert的帮助下搞明白了。Python似乎把import datetime
和from datetime import *
看成是一样的。
有效的代码:
import datetime
from django.db import models
class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __unicode__(self):
return self.question
def was_published_today(self):
return self.pub_date.date() == date.today()
无效的代码:(唯一的不同就是导入的方式和最后一行。)
from django.db import models
import datetime
class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __unicode__(self):
return self.question
def was_published_today(self):
return (self.pub_date() == datetime.date.today())
编辑:我想我没有说清楚。这个代码产生的错误信息是完全一样的,最后一行是return (self.pub_date.date() == datetime.date.today())
。我最开始忘记加.date()
并不是我想问的错误。
无效代码产生的错误信息:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/myDir/mySite/polls/models.py", line 11, in was_published_today
return (self.pub_date() == datetime.date.today())
TypeError: 'datetime.datetime' object is not callable
这到底是怎么回事?
我想问的不是忘记加.date()
。我想问的是:为什么在我的命名空间里有datetime,而我并没有使用from datetime import *
。
注意:第一个问题是问它在做什么。这个问题是问为什么。
更新:突然间它可以正常工作了。用datetime.date.today()
和date.today()
都可以。我的问题还是,为什么date.today()
可以用?看起来datetime在我的本地命名空间里,而我并没有把它放进去。为什么呢?
3 个回答
我的问题是:为什么在我的命名空间里有datetime,明明我没有使用from datetime import *。
因为你确实导入了datetime模块。所以在你的命名空间里就有了datetime。这里指的不是datetime这个类,而是整个模块。
Python并不会把import datetime
和from datetime import *
看成一样的。别再问为什么它会这样,因为它就是这样。
>>> import datetime
>>> date.today()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'date' is not defined
>>>
还有其他事情在发生。如果这是Django的魔法,我就不知道了。现在我没有Django的安装环境可以试试这个。(如果有特别简单的方法可以做到这一点,请告诉我。简单安装Django还不够。:))
你代码中的问题出在这部分:
return (self.pub_date() == datetime.date.today())
self.pub_date
是一个 datetime.datetime
的实例。它不能像那样被调用。举个例子:
>>> import datetime
>>> d = datetime.datetime.now()
>>> d()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'datetime.datetime' object is not callable
>>>
如果你只想比较 date
,你应该这样调用:
return (self.pub_date.date() == datetime.date.today())
正如我们在评论中讨论的那样,问题不在于代码本身,而在于你更新源代码的方式。Python会把模块存储在sys.modules
里。你可以使用reload
函数来重新加载单个模块,但对于很多更改,最好是重新加载整个环境。在很多情况下,看起来好像更改已经生效,因为错误信息似乎发生了变化。这是因为Python并不会缓存文件的源代码,所以当它引用代码时,会显示最新的版本。希望现在你能更成功地应用其他的答案。