【问题标题】:PyCharm: List all usages of all methods of a classPyCharm:列出类的所有方法的所有用法
【发布时间】:2016-08-30 02:42:51
【问题描述】:

我知道我可以使用“查找用法”来查找调用类中方法的内容。 有没有办法对给定类的所有方法执行此操作? (或者实际上是文件中的所有方法)

用例:我正在尝试重构一个上帝类,它几乎可以肯定是几个类。如果能够看到上帝类方法的子集,以及与之交互的类使用,那就太好了。看起来 PyCharm 已经完成了这方面的工作,但并没有让我扩大规模。

我正在使用 PyCharm 2016.1.2

https://intellij-support.jetbrains.com/hc/en-us/community/posts/206666319-See-all-callers-of-all-methods-of-a-class

【问题讨论】:

  • AFAIK PyCharm 中没有这样的选项。此外,我不确定我能看到这样一个特性的好处:假设你有一个有两个方法的类并且你有这个特性,它会说这两个方法在你的项目中被使用了 146 次。现在假设一种方法只使用一次,另一种方法使用 145 次。 146这个数字现在是什么意思?你能用这样的信息做什么?
  • 我想被告知:[classes] 使用方法 A,[classes] 使用方法 B 和/或 ClassA 使用 [methods],ClassB 使用 [不同的方法集],ClassC 使用 [另一组不同的方法]等。然后我就可以更容易地弄清楚我的上帝类中是否有不同的功能子集,这将有助于我重构它。
  • 我认为分组应该由具有相关功能的方法组完成,而不是按用法。自上而下进行清理可能也有助于清理其他类,而使用原始方法(按使用分组 - 自下而上)可能会在不应耦合的代码模块/类之间产生不必要的耦合。

标签: python python-3.x python-2.7 intellij-idea pycharm


【解决方案1】:

这是可能的,但你必须处理抽象,否则 Pycharm 不知道有问题的方法属于你的特定类。又名-Type Hinting

将找不到在没有类型提示的抽象层中调用的该方法的任何实例。

例子:

#The class which has the method you're searching for.
class Inst(object):
    def mymethod(self):
        return

#not the class your looking for, but it too has a method of the same name.
class SomethingElse(object):
    def mymethod(self):
        return

#Option 1 -- Assert hinting
def foo(inst):
    assert isinstance(inst, Inst)
    inst.mymethod()

#Option 2 --  docstring hinting
def bar(inst):
    """

    :param inst: 
    :type inst: Inst 
    :return: 
    :rtype: 
    """
    inst.mymethod()

【讨论】:

    【解决方案2】:

    如今,Pycharm 很容易使用 Python 3.6 类型提示并“正确”匹配函数调用,因为类型提示是 Python 3.5/3.6 语言的一部分。当然,大型软件中的部分类型提示在解析方法调用的目标时会造成一些妥协。

    这是一个示例,类型提示如何使执行类型推断逻辑和解析正确的调用目标变得非常容易。

    def an_example():
        a: SoftagramAnalysisAction = SoftagramAnalysisAction(
            analysis_context=analysis_context,
            preprocessors=list(preprocessors),
            analyzers=list(analyzers),
            analysis_control_params=analysis_control_params)
        output = a.run()
    

    在上面的示例中,局部变量 a 被特别标记为具有 SoftagramAnalysisAction 类型,这清楚地表明 run() 调用下面的目标是该类(或其任何可能的子类)的 run 方法。

    当前版本 (2018.1) 无法正确解决此类调用,但我希望将来会有所改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      相关资源
      最近更新 更多