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

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

此问题与Intellij IDE有关,但如果需要回答,也与一般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。目的是手动创建链接,以便在编辑时很容易从一个链接跳转到另一个链接。

javascript python debugging intellij-idea pycharm
1个回答
0
投票

我认为IDE不存在一种方法,可以在不编写自己的插件的情况下使代码看起来像现在一样,从一个直接链接到另一个,我不建议这样做。但是,您可以通过某些方式更改代码,这可能会对您有所帮助。

选项1:链接到通用定义

如果两个脚本都导入包含定义endpoint1 = 'endpoint1'的相同脚本,那么您将使用send({'command': endpoint1})if case(endpoint1):,则可以从一种用法跳到定义,然后再跳到另一种用法。

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

此选项将使行为更接近您想要的。在这里,您使用一个类来表示您可能发送或切换的每个可能的值,并将在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()}),并在另一端反序列化。这将使您可以直接从发送导航到要发送的任何类,然后使用定义和用法导航再次返回。

© www.soinside.com 2019 - 2024. All rights reserved.