Оператор импорта в определении библиотеки не выполняется - PullRequest
2 голосов
/ 25 февраля 2011

У меня проблема, которая может быть довольно простой, но, как ученик Python, я боролся с ней часами.До сих пор документация не дала мне ответа.

Проблема в том, что оператор import, включенный в модуль, кажется, не выполняется, когда я импортирую этот модуль из скрипта python.У меня есть следующее:

У меня есть файл project.py (т.е. библиотека python), который выглядит следующим образом:

import datetime

class Project:
    """ This class is a container for project data """

    title        = ""
    manager      = ""
    date         = datetime.datetime.min

    def __init__( self, title="", manager="", date=datetime.datetime.min ):
    """ Init function with some defaults """

        self.title        = title
        self.manager      = manager
        self.date         = date

Эта библиотека позже используется в сценарии (file.py) который импортирует проект, он запускается так:

import project

print datetime.datetime.min

Проблема возникает тогда, когда я пытаюсь выполнить этот скрипт с Python file.py.Затем Python жалуется на следующее NameError:

Traceback (most recent call last):
  File "file.py", line 3, in <module>
    print datetime.datetime.min
NameError: name 'datetime' is not defined

Это на самом деле происходит также, если я пытаюсь сделать те же самые утверждения (import и print) непосредственно из оболочки Python.

Разве модуль datetime не должен автоматически импортироваться в тот самый момент, когда я звоню import project?

Заранее большое спасибо.

Ответы [ 2 ]

4 голосов
/ 25 февраля 2011

Модуль datetime импортируется только в пространство имен project. Таким образом, вы могли бы обращаться к нему как project.datetime.datetime.min, но на самом деле вы должны импортировать его непосредственно в свой скрипт.

Каждый символ (имя), который вы создаете в своем файле project.py (например, в своем классе Project), попадает в пространство имен project, которое включает в себя вещи, которые вы импортируете из других модулей. Однако это не так неэффективно, как может показаться - фактический модуль datetime импортируется только один раз, независимо от того, сколько раз вы это делаете. Каждый раз, когда вы импортируете его после первого, он просто импортирует names в текущее пространство имен, но фактически не выполняет всю тяжелую работу по чтению и импорту модуля.

0 голосов
/ 25 февраля 2011

Попробуйте представить себе оператор import примерно равным:

project = __import__('project')

Фактически оператор import - это просто присвоение переменной.При загрузке модуля могут быть некоторые побочные эффекты, но внутри скрипта все, что вы видите, - это простое присвоение имени.

Вы можете получить все имена из модуля, используя from project import *, но не делайте этого , потому что это делает ваш код более хрупким и сложным в обслуживании.Вместо этого либо просто импортируйте модуль, либо в точности те имена, которые вам нужны.

Так что для вашего кода вы должны сделать что-то вроде:

import datetime
from project import Project

.

...