代码之家  ›  专栏  ›  技术社区  ›  xendi

Intellij IDEA&PyCharm-只有在运行时才知道的代码行之间的链接

  •  0
  • xendi  · 技术社区  · 4 年前

    这个问题是关于Intellij-IDEs的,但是如果需要回答的话,也涉及一般的ide。假设我在一个项目中有多个Python脚本。在一个文件中,我可能有这样的内容:

    with Switch(command) as case:
        if case('endpoint1'):
            print('do something')
        if case.default:
            pass
    

    在另一个脚本中,我有一个脚本,它ping第一个脚本:

    send({'command': 'endpoint1'})
    

    有没有什么IDE特性可以让我把这两行代码链接起来,因为其中一行代码与另一行代码直接相关?或者某种方式来链接字符串文本 endpoint1 ? 不管怎样,还是两者都有?关键是我可以很容易地跳出呼叫代码 send case('endpoint1') 不必手动搜索字符串或依赖于注释。有办法吗?

    注意:在某些情况下,即使是调试器也无法建立这样的链接,因为它可能是一个HTTP请求或RPC来链接它们。其目的是手动创建链接,以便在编辑时很容易从一个链接跳到另一个链接。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Oli    4 年前

    我不认为有一种方法可以让IDE直接从一个链接到另一个,而你的代码看起来和现在一样,而不需要编写自己的插件,我不建议这样做。但是,有一些方法可以更改代码,这可能会对您有所帮助。

    选项1:链接到通用定义

    endpoint1 = 'endpoint1' ,然后使用 send({'command': endpoint1}) if case(endpoint1):

    选项2:使用继承而不是“switch”语句定义逻辑

    from abc import ABC, abstractmethod
    
    
    class AbstractEndpoint(ABC):
        def do_stuff(self):
            # default
            pass
    
        @abstractmethod
        def serialize(self):
            pass
    
    
    class Endpoint1(AbstractEndpoint):
        def do_stuff(self):
            print('do something')
    
        def serialize(self):
            return 'endpoint1'
    
    
    class Endpoint2(AbstractEndpoint):
        def do_stuff(self):
            print('do something else')
    
        def serialize(self):
            return 'endpoint2'
    
    
    class Endpoint3(AbstractEndpoint):
        # does not override do_stuff, so default behaviour is used
    
        def serialize(self):
            return 'endpoint3'
    
    
    deserialize_dict = {'endpoint1': Endpoint1, 'endpoint2': Endpoint2, 'endpoint3': Endpoint3}
    
    
    def deserialize(string_repr):
        return deserialize_dict[string_repr]()
    
    
    e = Endpoint1()
    
    # prints 'do something'
    e.do_stuff()
    
    # convert to and from string
    e_serialize = e.serialize()
    print(deserialize(e_serialize))
    
    # does nothing because it doesn't override default behaviour
    Endpoint3().do_stuff()
    

    然后修改send函数以序列化对象,这样就可以编写 send({'command': Endpoint1()})