如何在循环导入的情况下将A类的引用传递给B类,同时在Pycharm中保持类型提示和自动完成功能

问题描述 投票:-1回答:1

在Python 3.7.2中,我有两个相互引用的类。

我查看了问题和答案:Circular (or cyclic) imports in Python

并且他们没有回答在循环导入时如何保持类型提示和自动完成功能的问题。为了让Pycharm自动完成代码,我问这个问题。

类#1表示ElasticSearch Server并导入类#2作为其成员,以便将其公开为内部搜索功能。

类#2表示一组搜索JSON模式并导入类#1,以便定义它从类#1接收的实例的类型。这允许Class#2运行在Class#1中定义的GET \ POST方法。

这看起来像这样:

class SimplifiedElasticSearch

from framework.elk.search_patterns import SearchPatterns

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

class SearchPatterns

from framework.elk.simplified_elastic_search import SimplifiedElasticSearch

class SearchPatterns(object):

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

您可以看到两个模块相互导入,并且在__ init __上将类SimplifiedElasticSearch的实例传递给类SearchPatterns


这会导致导入错误

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

为了防止错误,一个选项是不导入类SimplifiedElasticSearch,i.d。删除该行

from framework.elk.simplified_elastic_search import SimplifiedElasticSearch

并为我传递给类SearchPatterns的SimplifiedElasticSearch实例编写自动完成和类型提示的代码


如何为这种情况保留自动完成和类型提示?

python pycharm python-import cyclic
1个回答
-1
投票

我建议采用以下模式。使用它将允许自动完成和类型提示正常工作。

simplified_elastic_search.朋友

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.朋友

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-----------------')

您无法使用此语法导入简化的ElasticSearch和搜索模式类

from simplified_elastic_search import SimplifiedElasticSearch  
from search_patterns import SearchPatterns

你不能在类SearchPatterns的__ init __方法中声明参数ses的类型,但你可以这样“强制转换”它:

def __init__(self, ses):
    self.ses: simplified_elastic_search.SimplifiedElasticSearch = ses
© www.soinside.com 2019 - 2024. All rights reserved.