0

我想要一种方法来列出两个可变变更集之间涉及的所有 python 方法。是否有可用的工具可以轻松做到这一点?

基于评论的澄清:

我不是在寻找 100% 全面的东西。如果该工具可以识别差异中更改的每一行,那么它属于哪个方法/类,那就太好了。

4

2 回答 2

0

我不知道有任何工具可以做到这一点,但它应该可以通过自定义解决方案来实现。这取决于您想要采用的解决方案有多复杂。

这里有两个可能的解决方案,但没有太多细节: 解决方案 1:在变更集之间进行比较,并确保您的 hg diff 命令在其中有很多上下文(-U 选项),然后有一个简单的脚本从更改行中搜索到最近的函数定义(一个简单的正则表达式应该做)

解决方案 2:如上解析更改行号的差异(例如 @@ -7,6 +7,10 @@ ),然后编写一个自省工具,告诉您该行来自哪个函数。显然这可能会变得非常复杂,但这里有一个非常简单的近似值:

    import sys

    if __name__ == '__main__':
        import foo
        f_list = []
        in_line = int(sys.argv[1])
        for k,v in sys.modules['foo'].__dict__.iteritems():
            if k.startswith('__'):
                continue
            if hasattr(v, '__call__'): #We have a function
                f_list.append((v.__name__, v.__code__.co_firstlineno))
        #sort our function list according to starting line of each function (if needed)
        last_fn = None
        for f_name, f_line in f_list:
            if f_line >= in_line:
                break;
            else:
                last_fn = f_name

        if last_fn:
                print 'Line {} is probably in function {}'.format(in_line, last_fn)

在这里,我只是查看模块 foo 但可以将其更改为您需要的任何模块。我不会粘贴我的模块的内容,所以你必须相信我它可以工作:)

    ./intro.py 7 
    Line 7 is probably in function do_foo

    ./intro.py 13
    Line 13 is probably in function do_blah
于 2013-10-07T21:22:53.970 回答
0

识别“当前方法”显然取决于文件的语言,因此您不会在 mercurial 命令集中找到现成的解决方案。但是手动扫描一个python文件并跟踪当前的类和方法并不难(只要代码不玩语法游戏)。你确实说过你不需要它是防弹的,对吧?

hg annotate如果要比较的变更集之一是另一个变更集的祖先,那么您应该从(aka )中获得相当不错的里程数hg blame,它会告诉您文件中的每一行最后一次被触摸的时间。然后,您可以扫描文件以查找最近的更改,同时跟踪当前的类和方法或函数。

如果变更集有更复杂的关系,您可能需要做一些工作:运行两个版本之间的差异,并解析差异输出以获取已更改的文件行对列表;然后扫描源文件以找出包含每个更改的类和方法。(或者,您可以预处理源文件以构建索引,然后查看差异)。

于 2013-10-07T18:48:32.473 回答