我不想导入我的模块。我必须计算给定.py文件路径的函数数。这样做的最佳方式是什么?
我想到的一件事就是计算" def"在我的代码中,但它似乎不是最好的方法来解决这个问题。有没有更好的方法来计算功能的数量?
答案 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
答案 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))
希望有帮助