【问题标题】:What's the best way to sort class definitions in a python source file?在 python 源文件中对类定义进行排序的最佳方法是什么?
【发布时间】:2011-09-30 23:02:21
【问题描述】:

我有一个包含许多类定义的 .py 源代码,如下所示:

class C:
    # code c

class A:
    # code a

class B:
    # code b

我想把它变成:

class A:
    # code a

class B:
    # code b

class C:
    # code c

有这方面的工具吗?用 emacs 做呢?

【问题讨论】:

  • 类名从Z改成C是故意的吗?
  • 你想按字母顺序排列你的课程吗?
  • 按词法名称对模块成员进行排序几乎从来都不是一种有用/明智的方法。按逻辑相关性对它们进行排序(根据需要,基类自然排在子类之前)。您的目标是生成可读/可维护的代码,而不是强迫症式的任意规则应用。只需简单的查找操作即可轻松查找类的定义,无需按字母顺序排列成员即可轻松找到。
  • @bobince:请将您的答案作为答案发布,以便我们正确投票。
  • 嗯,这不是一个真正的答案,只是一个熨平板。 :-) 也许这样做是有充分理由的。可能不是,但也许。

标签: python emacs organization


【解决方案1】:

我同意 bobince 的观点,即按字母顺序不是对函数或其他代码位进行排序的有用方法,但您可以试试 sort-paragraphs。它甚至可能会起作用。

如果没有,那么我可以通过查看 sort-paragraphs 的实现来看到它这样做:

  (sort-subr reverse
     (function
      (lambda ()
        (while (and (not (eobp)) (looking-at paragraph-separate))
          (forward-line 1))))
     'forward-paragraph))))

我敢打赌,你可以想出一些功能来插入那里,让它工作。第一个将点移到下一条记录的开头,第二个将点移到当前记录的结尾。函数有一些可选参数告诉它排序键在记录中的位置,这也可能派上用场。

这些函数在 sort.el 中;您可以使用C-h f sort-paragraphsC-h f sort-subr 为他们提取文档;这将包括指向源的链接。

玩得开心:)

【讨论】:

    【解决方案2】:

    我为您编写了代码,但这只是因为我有兴趣了解sort-subr 的工作原理。我确实宽恕原始问题的意图。 :)

    另外,如果你赞成这个答案,请也赞成@db48x 的教学答案。

    使用 python-sort-defs 的方式与使用 sort-paragraph 的方式相同。

    (defun python-sort-defs (reverse beg end)
      (interactive "P\nr")
      (save-excursion
        (save-restriction
          (narrow-to-region beg end)
          (goto-char (point-min))
          (sort-subr reverse
                     (function
                      (lambda ()
                        (while (and (not (eobp)) (looking-at paragraph-separate))
                          (forward-line 1))))
                     'python-end-of-block-must-move))))
    
    (defun python-end-of-block-must-move ()
      (when (eq (point) (progn
                          (python-end-of-block)
                          (point)))
        (forward-line 1)))
    

    【讨论】:

      【解决方案3】:

      按字母顺序排序在测试代码中是有意义的。对于包含许多特定测试的测试用例,一些测试(或者可能只是测试名称)将被复制。在进行重复数据删除之前按字母顺序对测试进行排序是一个好主意。

      【讨论】:

        猜你喜欢
        • 2013-07-07
        • 2021-06-09
        • 1970-01-01
        • 1970-01-01
        • 2018-11-20
        • 1970-01-01
        • 2010-09-18
        • 1970-01-01
        • 2010-12-16
        相关资源
        最近更新 更多