2016-03-22 3 views
3

Я пишу пакет Python, который выглядит следующим образом:Невозможно создать класс Python, даже если он импортируется

|- datum/ 
    |- __init__.py 
    |- database.py 

__init__.py

from .database import Database 

def connect(url): 
    print(Database)   # for debugging 
    return Database(url) 

database.py

class Database(object): 
    def __init__(self, url): 
     self.url = url 

    ...more methods 

Это установлено как пакет под названием datum в режиме разработки. Если я называю connect за пределами этого пакета, как:

import datum 
db = datum.connect('postgresql://xxx') 

... это выход:

<class 'datum.database.Database'> 
Traceback (most recent call last): 
    File "Z:\AIS\Flask\ais\engine\scripts\load_pwd_parcels.py", line 30, in <module> 
    source_db = Database(source_db_url) 
NameError: name 'Database' is not defined 

Я запутался, потому что класс импортируется нормально - я могу напечатать его и даже запустите dir и просмотрите все мои методы - но когда я пытаюсь создать что-то, это «не определено». Кто-нибудь знает, что я здесь делаю неправильно?

+0

Где храниться 'load_pwd_parcels.py' относительно вашего каталога' datum'? – chepner

+0

Это отдельный пакет (приложение для фляшек). – Rob

+1

Вы уверены, что используете версию 'datum', которая имеет класс' Database'? Недостаточно информации в вашем вопросе, чтобы воспроизвести проблему. – chepner

ответ

0

A NameError означает, что локальное или глобальное имя не может быть найдено. Я хотел бы убедиться, что ваш файл «load_pwd_parcels.py» включает в себя:

from database import Database 

В качестве альтернативы, вы можете сделать:

import database 
source_db = database.Database(source_db_url) 

Последний вариант является отличным выбором, потому что это дает database его очень собственное пространство имен. По словам Тима Петерса в PEP 20 -- The Zen of Python: «Пространства имен - одна хорошая идея - давайте сделаем больше!»

Смежные вопросы