import模块与from模块import *有什么区别?

1 投票
3 回答
1559 浏览
提问于 2025-04-16 08:40

我在学习Django教程时遇到了一些问题,所以在这里提了个问题。 没有人知道答案,但我最终在Robert的帮助下搞明白了。Python似乎把import datetimefrom 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 个回答

2

我的问题是:为什么在我的命名空间里有datetime,明明我没有使用from datetime import *。

因为你确实导入了datetime模块。所以在你的命名空间里就有了datetime。这里指的不是datetime这个类,而是整个模块。

Python并不会把import datetimefrom 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还不够。:))

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

正如我们在评论中讨论的那样,问题不在于代码本身,而在于你更新源代码的方式。Python会把模块存储在sys.modules里。你可以使用reload函数来重新加载单个模块,但对于很多更改,最好是重新加载整个环境。在很多情况下,看起来好像更改已经生效,因为错误信息似乎发生了变化。这是因为Python并不会缓存文件的源代码,所以当它引用代码时,会显示最新的版本。希望现在你能更成功地应用其他的答案。

撰写回答