Как передать ссылку класса A на класс B в случае циклического импорта, сохранив в Pycharm возможности подсказки типов и автозаполнения - PullRequest
0 голосов
/ 25 апреля 2019

В Python 3.7.2 у меня есть два класса, которые ссылаются друг на друга.

Я посмотрел на вопрос и ответы в: Круговой (или циклический) импорт в Python

и они не отвечают на вопрос о том, как сохранить возможности подсказки типов и автозаполнения при циклическом импорте. Чтобы позволить Pycharm автоматически завершать код, я задаю этот вопрос.

Класс # 1 представляет сервер ElasticSearch и импортирует класс № 2 в качестве его члена, чтобы предоставить его в качестве возможностей внутреннего поиска.

Класс # 2 представляет группу шаблонов поиска JSON и импортирует класс # 1, чтобы определить тип экземпляра, который он получает из класса # 1. Это позволяет классу № 2 запускать методы GET \ POST, определенные в классе № 1.

Это выглядит примерно так:

класс SimplifiedElasticSearch

from framework.elk.search_patterns import SearchPatterns

class SimplifiedElasticSearch(object):
    ...
    ...

класс SearchPatterns

from framework.elk.simplified_elastic_search import SimplifiedElasticSearch

class SearchPatterns(object):

    def __init__(self, es_server: SimplifiedElasticSearch):
        ...
        ...

Вы можете видеть, что оба модуля импортируют друг друга, и экземпляр класса SimplifiedElasticSearch передается в класс SearchPatterns после __ init __


Это приводит к ошибке импорта

ImportError: cannot import name 'SimplifiedElasticSearch' from 'framework.elk.simplified_elastic_search'

Чтобы предотвратить ошибку, можно НЕ импортировать класс SimplifiedElasticSearch, т.е. удалить строку

from framework.elk.simplified_elastic_search import SimplifiedElasticSearch

и написать код с автозаполнением и подсказкой типа для экземпляра SimplifiedElasticSearch, который я передаю классу SearchPatterns


Как сохранить автозаполнение и подсказку типа для такого случая?

1 Ответ

0 голосов
/ 25 апреля 2019

Предлагаю следующую схему. С его помощью автозаполнение и подсказки будут работать правильно.

simplified_elastic_search.py ​​

import search_patterns 

class SimplifiedElasticSearch(object):
    def __init__(self):
        pass

    def print_ses(self):
        print('SimplifiedElasticSearch')

if __name__ == '__main__':
    ses = SimplifiedElasticSearch()
    ses.print_ses()

    sp = search_patterns.SearchPatterns(ses)
    sp.print_sp()

search_patterns.py

import simplified_elastic_search 

class SearchPatterns(object):
    def __init__(self, ses):
        self.ses: simplified_elastic_search.SimplifiedElasticSearch = ses

    def print_sp(self):
        print('SearchPatterns-1-----------------')
        self.sp.print_sp()
        print('SearchPatterns-2-----------------')

Вы не можете импортировать классы SimplifiedElasticSearch & SearchPatterns, используя этот синтаксис

from simplified_elastic_search import SimplifiedElasticSearch  
from search_patterns import SearchPatterns

Вы не можете объявить тип параметра ses в методе __ init __ класса SearchPatterns, но вы можете "привести его" следующим образом:

def __init__(self, ses):
    self.ses: simplified_elastic_search.SimplifiedElasticSearch = ses
...