модуль импорта == из модуля импорта *? - PullRequest
1 голос
/ 17 декабря 2010

У меня была проблема с руководством по Django, поэтому я задал вопрос здесь. Никто не знал ответа, но я в конце концов понял его с помощью Роберта .Кажется, 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() работает?Кажется, дата и время находятся в моем локальном пространстве имен, и я не помещаю их туда.Почему?

Ответы [ 3 ]

4 голосов
/ 17 декабря 2010

Проблема в последнем фрагменте связана с этой частью вашего кода:

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 голосов
/ 17 декабря 2010

«Мой вопрос: почему в моем пространстве имен дата-время не используется из импорта из даты-времени *.»

Потому что вы импортировали дату и время. Тогда у вас есть 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, где я могу попробовать это в данный момент. (Если есть супер-быстрый способ сделать это, скажите мне. Easy_install Django было недостаточно. :))

2 голосов
/ 17 декабря 2010

Как мы обсуждали в комментариях, проблема не в коде, а в способе обновления исходного кода.модули кэша Python в sys.modules.Вы можете перезагрузить отдельные модули, используя функцию reload, но для многих изменений лучше всего перезагрузить всю оболочку.Во многих случаях это выглядело так, как будто изменения распространялись, потому что сообщения об ошибках, казалось, изменились, это потому, что python не кэширует исходный код файла, поэтому, когда он ссылается на код, он показывает вам новейшую версию.Надеюсь, теперь вы можете применить другие ответы с большим успехом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...