Python Rope:如何在所有子模块重构中查找所有缺少的导入和错误

时间:2014-05-14 02:42:13

标签: python refactoring automated-tests

我试图找到每个模块及其子模块的所有缺少的import语句和错误。

我正在尝试做什么专用工具?

我写的代码,但看起来非常糟糕,也许这样的东西已经存在了?:

import os
def find_missing_imports(walk):
    for items in walk:
        d = items[0]
        f_list = items[1]
        for f in f_list:
            module = f[:-3]
            # posix_path
            module_path = d.lstrip('.').replace('/','.').lstrip('.')
            try:
                __import__(module_path, fromlist=[module])
            except IndentationError, e:
                #print(f,e)
                pass
            except NameError, e:
                print(d,f,e)
                pass
            except Exception, e:
                print(f,e)
                pass

walk = [[root,files] for root,dirs,files in os.walk('.') for fn in files if  fn.endswith('.py')]
find_missing_imports(walk)

输出:

.[snip]
('./Sky_Group_Inventory_Scanner-wxpython/display_image/Dialogs', 'ImageSelectionFrame.py', NameError("name 'wx' is not defined",))
('./Sky_Group_Inventory_Scanner-wxpython/display_image/Dialogs', 'ItemSpecificsDialog.py', NameError("name 'wx' is not defined",))
('./Sky_Group_Inventory_Scanner-wxpython/display_image/Dialogs', 'ReturnCorrectWatchTitle.py', NameError("name 'wx' is not defined",))
.[snip]

我的重构之前的项目是一团糟但很有用,现在它在重构之后就已经破了。

阅读'实用程序员'根据我在codereview上的帖子提出的建议:

我一直在寻找源代码:

/usr/local/lib/python2.7/dist-packages/rope

ROPE的文档似乎有点稀疏。我也一直在使用Ninja-IDE,但我们无法找到解决我面临的问题的解决方案。

总的来说,我认为我错过了重构的全部内容。

可以看到当前的父目录布局here.

enter image description here

before.

相比

before

任何帮助,填写缺少的术语,或者我甚至要求的都会很棒。

解决方案:

pylint -E /path/to/module

1 个答案:

答案 0 :(得分:4)

pip install pylint

将pylint指向有问题的文件夹/模块:

pylint /path/to/module > pylint_output

这将创建一个包含全局评估的文件:

  • undefined-variable < - 这就是我在每个文件中寻找的内容。
  • 无效名称
  • line-too-long
  • 多余的parens
  • bad-whitespace
  • attribute-defined-outside-init
  • missing-docstring
  • bad-indentation
  • bad-continuation
  • broad-except
  • unused-argument
  • unused-import
  • unused-variable
  • no-self-use
  • no-member
  • fixme
  • unwanted-pass
  • 多重陈述
  • 太多陈述
  • 重复代码
  • 太多当地人
  • missing-final-newline
  • too-many-instance-attributes
  • 太多分支
  • redefined-builtin
  • 太多公共方法
  • syntax-error
  • relative-import
  • maybe-no-member
  • import-error
  • 超级老太太
  • bare-except
  • undefined-loop-variable
  • too-many-return-statements
  • 太多参数
  • 太少 - 公共方法
  • star-args
  • reimported
  • indexing-exception
  • 无法访问
  • 太多行
  • redefined-outer-name
  • property-on-old-class
  • pointless-string-statement
  • 无意义陈述
  • old-style-class
  • 模块中没有名字
  • global-variable-undefined
  • 表达未分配
  • bad-except-order
  • 分配从 - 无

我感兴趣并直接回答我的问题是在pylint结果中会有一些具有这种布局的行:

************* Module module_name.sub_module.class_name.method_name
R: line_no, column: Issue description 'some_name' (issue-type)
C: line_no, column: Issue description 'some_name' (issue-type)
W: line_no, column: Issue description 'some_name' (issue-type)
E: line_no, column: Issue description 'some_name' (issue-type)
F: line_no, column: Issue description 'some_name' (issue-type)
************* Module module_name.sub_module.class_name.method_name
R: line_no, column: Issue description 'some_name' (issue-type)
C: line_no, column: Issue description 'some_name' (issue-type)
W: line_no, column: Issue description 'some_name' (issue-type)
E: line_no, column: Issue description 'some_name' (issue-type)
F: line_no, column: Issue description 'some_name' (issue-type)    
  • [良好做法]指标违规的因素
  • [C]违反编码标准的违规行为
  • [W]关于文体问题或小编程问题
  • [E]对于重要的编程问题(即最有可能是bug)感到恐惧
  • [F]用于防止进一步处理的错误

因此,在我的大多数情况下,问题类型的(未定义变量)表示尚未导入的模块。 pylint -E /path/to/module将仅返回未定义变量的错误。