Невозможно импортировать из __init__ в подпапку - PullRequest
0 голосов
/ 06 июня 2018

Это моя структура папок:

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

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Импорт происходит до определения класса.В db/__init__.py вы импортируете pg.py, sqlite.py, что зависит от классов, определенных здесь.Чтобы решить эту проблему, переместите DbStorageAbstract в другой файл и, если вы собираетесь использовать его в том же файле с pg.py, sqlite.py, убедитесь, что импорт будет выглядеть следующим образом:

from . import dbstorage # this file is the new one contains DbStorageAbstract class
from . import pg, sqlite

Обратите внимание, что если дваМодули в зависимости друг от друга пытаются создать третий модуль, поэтому решите эту проблему.

0 голосов
/ 06 июня 2018

Я полагаю, вам следует создать еще один файл в вашем подкаталоге

storage/
    __init__.py - contains class StorageAbstract, class DummyStorage, class STORE_TYPE
    file.py - contains class FileStorage
    db/
        __init__.py - 
        pg.py - contains class PgStorage
        sqlite.py - contains class SQLiteStorage
        base.py contains class DbStorage, class DbStorageAbstract

Затем файлы pg.py и sqlite.py импортируют классы, такие как:

from base import DbStorageAbstract

Ифайл __init__.py также будет выглядеть так

from base import DbStorageAbstract,  DbStorageAbstract
...