给定路径计算python文件的函数数量的好方法

时间:2016-05-29 20:27:27

标签: python parsing

我不想导入我的模块。我必须计算给定.py文件路径的函数数。这样做的最佳方式是什么?

我想到的一件事就是计算" def"在我的代码中,但它似乎不是最好的方法来解决这个问题。有没有更好的方法来计算功能的数量?

5 个答案:

答案 0 :(得分:3)

您可以使用ast.NodeVisitor

import inspect
import importlib
import ast

class CountFunc(ast.NodeVisitor):
    func_count = 0
    def visit_FunctionDef(self, node):
        self.func_count += 1


mod = "/path/to/some.py"

p = ast.parse(open(mod).read())

f = CountFunc()
f.visit(p)

print(f.func_count)

如果您想要包含lambda,则需要添加visit_Lambda

 def visit_Lambda(self, node):
    self.func_count += 1

那将找到所有defs包括任何类的方法,我们可以添加更多限制来禁止:

class CountFunc(ast.NodeVisitor):
    func_count = 0

    def visit_ClassDef(self, node):
        return 

    def visit_FunctionDef(self, node):
        self.func_count += 1


    def visit_Lambda(self, node):
        self.func_count += 1

您可以根据需要定制代码,所有节点及其属性都在greentreesnakes docs

中描述

答案 1 :(得分:3)

要计算顶级定义,请使用ast模块,如下所示:

import ast

with open(filename) as f:
    tree = ast.parse(f.read())
    sum(isinstance(exp, ast.FunctionDef) for exp in tree.body)

答案 2 :(得分:1)

Padraic打败了我,但这是我的代码,适用于Python 2和Python 3.

from __future__ import print_function
import ast

class FunctionCounter(ast.NodeVisitor):
    def __init__(self, filename):
        self.function_count = 0
        with open(filename) as f:
            module = ast.parse(f.read())
            self.visit(module)

    def visit_FunctionDef(self, node):
        print('function: {}'.format(node.name))
        self.function_count += 1

    # Uncomment this to disable counting methods, properties within a
    # class
    # def visit_ClassDef(self, node):
    #     pass

if __name__ == '__main__':
    counter = FunctionCounter('simple.py')
    print('Number of functions: {}'.format(counter.function_count))

讨论

  • 此代码不仅计算模块级别的函数,还计算嵌套在类定义中的函数(方法和属性)。
  • 要在类定义中禁用计数功能,请取消注释visit_ClassDef
  • 的2行

答案 3 :(得分:0)

您可以使用pyclbr模块获取模块的结果,唯一的问题是您需要使用模块的名称,而不是文件路径,这也可以从识别中获益from X import Y用于基于python源的模块(不是内置的模块,如math

from pyclbr import readmodule_ex, Function
#readmodule_ex is function 1

def test(): #2
    pass
def other_func(): #3
    pass

class Thing:
    def method(self):
        pass


result = readmodule_ex("test") #this would be it's own file if it is test.py

funcs = sum(isinstance(v,Function) for v in result.values())

print(funcs)

答案 4 :(得分:0)

您可以使用

len(dir(module))

希望有帮助