Это моя структура папок:
storage/
__init__.py - contains class StorageAbstract, class DummyStorage, class STORE_TYPE
file.py - contains class FileStorage
db/
__init__.py - contains class DbStorage, class DbStorageAbstract
pg.py - contains class PgStorage
sqlite.py - contains class SQLiteStorage
Классы PgStorage и SQLiteStorage наследуются от DbStorageAbstract, поэтому мне нужно импортировать их.Я делаю это так (в pg.py и sqlite.py):
from . import DbStorageAbstract
И это приводит к следующей ошибке:
ImportError: cannot import name 'DbStorageAbstract'
Однако, когда я перемещаю DbStorageAbstract из хранилища /дБ / __ init__py.в хранилище / __ init__py и импортируйте его так:
from .. import DbStorageAbstract
, тогда он работает нормально.Я прочитал это , это и многие другие ресурсы, но все еще не могу понять, что является причиной проблемы.Если бы это была круговая зависимость, то перемещение класса в другой файл, я думаю, не помогло бы.
Если потребуется дополнительная информация, дайте мне знать в комментариях, и я отредактирую вопрос.
Я использую Python 3.5
РЕДАКТИРОВАТЬ:
Хотя этот вопрос был определен как возможный дубликат этот вопрос Я не вижукак это отвечает на мой вопрос.В отличие от другого вопроса, у меня уже есть файлы init в каждой папке.Если я ошибаюсь, пожалуйста, укажите мне, где я могу найти ответ.
РЕДАКТИРОВАТЬ 2: Это файл db / init .py:
##################################################################
# Copyright 2018 Open Source Geospatial Foundation and others #
# licensed under MIT, Please consult LICENSE.txt for details #
##################################################################
#import sys
#sys.path.append("/mnt/c/Users/Jan/Documents/GitHub/pywps")
import logging
from abc import ABCMeta, abstractmethod
from pywps import configuration as config
from .. import StorageAbstract
from . import sqlite
from . import pg
LOGGER = logging.getLogger('PYWPS')
class DbStorageAbstract(StorageAbstract):
"""Database storage abstract class
"""
__metaclass__ = ABCMeta
@abstractmethod
def store(self, output):
pass
@abstractmethod
def store_output(self, file_name, identifier):
pass
class DbStorage(StorageAbstract):
def __init__(self):
self.storage = self.get_db_type()
def store(self, output):
assert(self.storage is not None)
self.storage.store(output)
def get_db_type(self):
# get db_type from configuration
try:
db_type = config.get_config_value('db', 'db_type')
except KeyError:
raise exception("Database type has not been specified")
# create an instance of the appropriate class
if db_type == "PG":
storage = pg.PgStorage()
elif db_type == "SQLITE":
storage = sqlite.SQLiteStorage()
else:
raise exception("Unknown database type: '{}'".format(db_type))
return storage