确定函数是否包含特定方法

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?

Nik*_*ido 0

您可以使用另一种检查方法,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

这里有一些关于类检查的细节。