Bti*_*rt3 5 python code-inspection python-3.x
我想编写一些代码来检查学生提交的内容,以确保给定的函数包含np.random.choice.
例如:
import numpy as np
def checkme(z, x=[1,2,3], y=4):
tmp = np.random.choice(x, size=y)
if z:
print("z")
return(list(tmp))
Run Code Online (Sandbox Code Playgroud)
我已经看到我可以使用像
tmp = inspect.signature(checkme)
for param in tmp.parameters.values():
print(param.name, ",", param.default)
Run Code Online (Sandbox Code Playgroud)
确定参数和值,这很好,但我想更进一步,确保函数体包含特定的函数或方法。所以在上面,我想确保学生的代码包含np.random.choice.
如何访问函数体以“检查”并确定这是 True 还是 False?
您可以使用另一种检查方法,inspect.getsource它将以字符串形式获取函数的源代码。
import inspect
import numpy as np
def checkme(z, x=[1,2,3], y=4):
tmp = np.random.choice(x, size=y)
if z:
print("z")
return(list(tmp))
code = inspect.getsource(checkme)
lines = code.split("\n")
for line in lines:
print(line, "np.random.choice" in line)
Run Code Online (Sandbox Code Playgroud)
输出:
# def checkme(z, x=[1,2,3], y=4): False
# tmp = np.random.choice(x, size=y) True
# if z: False
# print("z") False
# return(list(tmp)) False
# False
Run Code Online (Sandbox Code Playgroud)
我拆分代码字符串以检查调用该方法的确切行
这种方法的问题在于别名
例如,如果您的学生以其他形式导入 numpy
import numpy as mynp
import numpy
import numpy as npy
Run Code Online (Sandbox Code Playgroud)
或者当然对于注释代码:
# np.random.choice
Run Code Online (Sandbox Code Playgroud)
ETC
这里有一些关于类检查的细节。