def foo(): while <condition>: do somethingdef bar(): for i in range(5): do something假设我在一个文件名中定义了两个函数test.py。python 有没有办法编写具有以下行为的函数?import testdef uses_while(fn: Callable) -> bool: (what goes here?)>>> uses_while(test.foo)True>>> uses_while(test.bar)False我本质上需要以编程方式检查函数是否使用 while 循环,而不需要手动检查代码。我想过使用 pdb.getsourcelines() ,但是如果里面有注释或字符串中包含“while”一词,那么这不起作用。有任何想法吗?
2 回答
慕的地8271018
TA贡献1796条经验 获得超4个赞
import ast
import inspect
from typing import Callable
def uses_while(fn: Callable) -> bool:
nodes = ast.walk(ast.parse(inspect.getsource(fn)))
return any(isinstance(node, ast.While) for node in nodes)
在 Python 3.9+ 上,您必须将其更改为from collections.abc import Callable.
慕勒3428872
TA贡献1848条经验 获得超6个赞
我编写了一个简单的函数,可以检查作为参数给出的函数是否包含 while 循环:
import inspect
def test_while(func):
flag = False
body = inspect.getsourcelines(func)
string = ''.join(body[0]).replace(' ', '')
splited = string.split('\n')
for chain in splited:
if len(chain) > 0 and chain[0] is not '#':
if chain.startswith('while'):
flag = True
return flag
添加回答
举报
0/150
提交
取消