【问题标题】:Intellij IDEA & PyCharm - Links between lines of code only known at runtimeIntellij IDEA 和 PyCharm - 仅在运行时知道的代码行之间的链接
【发布时间】:2020-09-04 20:56:04
【问题描述】:

这个问题是关于 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。目的是手动创建链接,以便在编辑时轻松从一个跳转到另一个。

【问题讨论】:

  • 您可以尝试使用bookmarks with mnemonicsfavorite groups
  • @CrazyCoder 那些很好。不完全是我想要的,但感谢他们。
  • Code Reading Note 插件可以做到这一点。让我们为我认为的代码行列表添加书签。

标签: javascript python debugging intellij-idea pycharm


【解决方案1】:

我认为 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({'command': Endpoint1()}),并在另一端反序列化。这将使您可以直接从发送导航到您要发送的任何类,然后使用定义和用法导航再次返回。

【讨论】:

  • 在某些情况下这是一个不错的观点。尽管如此,仍有许多情况无济于事。有很多我使用的是 2 种不同的语言。顺便说一句,我仍在搜索插件仓库。你有什么理由不建议写一个新的吗?我从来没有写过。
  • @xendi 看起来工作量很大。我也从来没有写过,所以也许我错了......
  • 我会接受这个答案。如果我决定创建一个插件,我将来可能会提供更好的答案。我真的很想。我对 Java 不太了解,但我们会看到。
  • @xendi 如果你不喜欢 Java,你可以试试 Kotlin 或者 Jython
猜你喜欢
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 2016-10-15
相关资源
最近更新 更多