导入模块==从模块导入*?

时间:2010-12-17 06:24:09

标签: python django django-models module import

I had a problem with the Django tutorial so I asked a question here.没有人知道答案,但我最终在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()

不工作代码:(唯一的区别是import语句和最后一行。)

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() NOT 我正在询问的错误

由无效代码生成的回溯:

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() AND date.today()。我的问题仍然存在,为什么date.today()有效?似乎datetime在我的本地命名空间中没有我放在那里。为什么呢?

3 个答案:

答案 0 :(得分:4)

后一段代码中的问题与代码的这一部分有关:

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())

答案 1 :(得分:2)

正如我们在评论中所讨论的那样,问题不在于代码,而在于您更新源代码的方式。 python缓存sys.modules中的模块。您可以使用reload函数重新加载单个模块,但是对于许多更改,最好重新加载整个shell。在许多情况下,似乎更改已传播,因为错误消息似乎已更改,这是因为python不会缓存文件的源代码,因此当它引用代码时,它会显示最新版本。希望现在,你可以更成功地应用其他答案。

答案 2 :(得分:2)

“我的问题是:为什么我的命名空间中的datetime没有我使用datetime import *。”

因为您确实导入了日期时间。然后在命名空间中有日期时间。不是CLASS日期时间,而是MODULE。

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安装,我现在可以尝试这个。 (如果有一种超快速的方法可以实现,请告诉我.easy_installing Django还不够。:))