繁体   English   中英

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

[英]How to pass reference of class A to class B in case of cyclic import while keeping type-hinting and auto-completion capabilities in Pycharm

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

我查看了以下问题和答案: Python 中的循环(或循环)导入

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

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

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

这看起来像这样:

类 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):
        ...
        ...

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


这会导致导入错误

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

为了防止错误,一种选择是不导入类 SimplifiedElasticSearch, id 删除该行

from framework.elk.simplified_elastic_search import SimplifiedElasticSearch

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


对于这种情况,如何保持自动完成和类型提示?

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

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

您不能在类 SearchPatterns 的 __ init __ 方法中声明参数 ses 的类型,但您可以通过这种方式“转换”它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM