【发布时间】:2019-06-03 05:01:31
【问题描述】:
假设我有一堆函数a、b、c、d 和e,我想知道它们是否直接使用循环:
def a():
for i in range(3):
print(i**2)
def b():
i = 0
while i < 3:
print(i**2)
i += 1
def c():
print("\n".join([str(i**2) for i in range(3)]))
def d():
print("\n".join(["0", "1", "4"]))
def e():
"for"
我想写一个函数uses_loop,这样我就可以期待这些断言通过了:
assert uses_loop(a) == True
assert uses_loop(b) == True
assert uses_loop(c) == False
assert uses_loop(d) == False
assert uses_loop(e) == False
(我希望uses_loop(c) 返回False,因为c 使用列表解析而不是循环。)
我无法修改 a、b、c、d 和 e。所以我认为可以使用ast 并沿着我从@987654338@ 获得的函数代码进行操作。 但我对任何其他建议持开放态度,这只是一个想法。
据我所知ast:
def uses_loop(function):
import ast
import inspect
nodes = ast.walk(ast.parse(inspect.getsource(function)))
for node in nodes:
print(node.__dict__)
【问题讨论】:
标签: python loops abstract-syntax-tree static-analysis inspect