【问题标题】:import module == from module import *?导入模块 == 从模块导入 *?
【发布时间】:2010-12-17 06:24:08
【问题描述】:

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

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

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()。我的问题是:为什么没有我使用from datetime import *,我的命名空间中有日期时间。

注意:第一个问题是问什么它在做什么。这个问题问为什么。

更新:突然就可以了。与datetime.date.today() AND date.today()。我的问题仍然存在,为什么date.today() 有效?似乎 datetime 在我的本地命名空间中,而我没有放在那里。为什么?

【问题讨论】:

  • 你的 Python 安装肯定搞砸了。
  • 第二种情况下的self.pub_date()不应该是self.pub_date.date(),就像第一种情况一样吗?
  • 这真的很奇怪。当我只做 import datetime; datetime.date.today() 而没有任何 Django 东西时,工作正常。
  • 我猜 self.pub_date 是不可调用的。
  • @Alok:这是代码不起作用工作的原因之一。

标签: python django django-models module import


【解决方案1】:

后一个 sn-p 的问题在于你的这部分代码:

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

【讨论】:

  • 看看另一个问题。他对此有误,但如果您从== 的后半部分删除datetime,他就可以了。问题不在于pub_date.date()(尽管他在问题中有错字),而是为什么datetime 似乎在不使用from 的情况下毒化了他的命名空间。
  • 我已经试过了。我在另一个问题的答案中提到了这一点。 return (self.pub_date.date() == datetime.date.today()) 不起作用!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    “我的问题是:为什么我的命名空间中的 datetime 没有我使用 from 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 还不够。:))

    【讨论】:

    • 我知道 Python 不应该 对它们一视同仁,但我觉得它是 。我也认为其他事情正在发生,但是什么?
    • @John:通过在代码中添加一个 pdb 可能很容易弄清楚。但我不能这样做,因为我已经两年没有使用 Django,所以我不知道如何让代码示例真正可运行。 :-) 我 猜测 Django 会神奇地在你的 locals() 上胡扯,但这只是一个疯狂的猜测。
    • @Lennart:输出在这里:pastebin.com/2eRuxajV 不幸的是,我不明白那个输出是什么意思。我不确定我做对了,那是我第一次使用 pdb。
    • 我应该补充一点 import polls.models 在解释器中工作正常。
    • @John:就在发生错误的那一行之前,坚持import pdb;pdb.set_trace()。然后您将能够检查局部变量并进入方法等。
    猜你喜欢
    • 2021-12-08
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多