此问题与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。目的是手动创建链接,以便在编辑时很容易从一个链接跳转到另一个链接。
我认为IDE不存在一种方法,可以在不编写自己的插件的情况下使代码看起来像现在一样,从一个直接链接到另一个,我不建议这样做。但是,您可以通过某些方式更改代码,这可能会对您有所帮助。
如果两个脚本都导入包含定义endpoint1 = 'endpoint1'
的相同脚本,那么您将使用send({'command': endpoint1})
和if case(endpoint1):
,则可以从一种用法跳到定义,然后再跳到另一种用法。
此选项将使行为更接近您想要的。在这里,您使用一个类来表示您可能发送或切换的每个可能的值,并将在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()})
,并在另一端反序列化。这将使您可以直接从发送导航到要发送的任何类,然后使用定义和用法导航再次返回。