Python 检查函数中是否使用了某些运算符

Python 检查函数中是否使用了某些运算符,python,operators,Python,Operators,我想禁止在函数中使用某些运算符,例如,我想确保在以下函数中未使用**幂运算符: def pow(x, y): return x ** y 我使用了inspect.getsource来获取源代码,并检查源代码中是否存在“**”,但如果源代码中的其他地方碰巧存在“**”,则会错误地导致断言错误,因此如何实际检查代码中是否存在特定运算符?可能使用模块: 您可能需要在Python中解析它,可能需要使用模块?: 您可能需要在Python中解析它。注意:我们在这里处理的字节码是一个CPython实

我想禁止在函数中使用某些运算符,例如,我想确保在以下函数中未使用
**
幂运算符:

def pow(x, y):
    return x ** y
我使用了
inspect.getsource
来获取源代码,并检查源代码中是否存在
“**”
,但如果源代码中的其他地方碰巧存在
“**”
,则会错误地导致断言错误,因此如何实际检查代码中是否存在特定运算符?

可能使用模块:

您可能需要在Python中解析它,可能需要使用模块?:


您可能需要在Python中解析它。注意:我们在这里处理的字节码是一个CPython实现细节。不要指望它能在其他Python实现上工作。喜欢


在CPython 3.4+中,您可以使用检查函数的代码对象中是否存在指令(也在文档中解释):


具体来说,对于CPython 2.X,您可以尝试PyPI上提供的包(其Python 3 fork:):



相关:

注意:我们在这里处理的字节码是一个CPython实现细节。不要指望它能在其他Python实现上工作。喜欢


在CPython 3.4+中,您可以使用检查函数的代码对象中是否存在指令(也在文档中解释):


具体来说,对于CPython 2.X,您可以尝试PyPI上提供的包(其Python 3 fork:):



相关:

如果您手头有3.4,我个人会选择Ashwini的答案,但是,如果您需要更兼容一点并且不介意解析源代码,那么您可以使用
ast
,例如:

import inspect
import ast

def pow(x, y):
    return x ** y

nodes = ast.walk(ast.parse(inspect.getsource(pow)))
has_power = any(isinstance(node, ast.Pow) for node in nodes)

如果您手头有3.4,我个人会选择Ashwini的答案,但是,如果您需要更兼容一点并且不介意解析源代码,那么您可以使用
ast
,例如:

import inspect
import ast

def pow(x, y):
    return x ** y

nodes = ast.walk(ast.parse(inspect.getsource(pow)))
has_power = any(isinstance(node, ast.Pow) for node in nodes)

我认为您必须放入一个虚拟类实例,其中禁止的操作(例如,pow)引发异常。我认为您必须放入一个虚拟类实例,其中禁止的操作(例如,pow)引发异常。我使用的是python 2.7,我应该指定。这正是我想要的,我已经查看了
ast.walk
,但是缺少了
ast.parse
,以使其正常工作。我使用的是python 2.7,我应该指定。这正是我所要寻找的,我已经查看了
ast.walk
,但是缺少了
ast.parse
,以使其正常工作。干杯,我应该指定它用于python 2.7,但答案无疑对其他人有用,我找不到与此相关的任何问题。
dis
在某些python实现中不可用<代码>ast是更好的选择。@wim很酷。添加一个关于它的注释。干杯,我应该指定它是用于Python2.7的,但答案对其他人会很有用。毫无疑问,我找不到任何相关的问题。
dis
在某些python实现中不可用<代码>ast是更好的选择。@wim很酷。添加一个关于它的注释。
>>> import byteplay
>>> def search_instruction(code_object, instr_code):
        for ins, _ in byteplay.Code.from_code(code_object).code:
                if ins == instr_code:
                    return True
        return False
...     
>>> search_instruction(f1.__code__, 19)
True
>>> search_instruction(f2.__code__, 19)
False
import inspect
import ast

def pow(x, y):
    return x ** y

nodes = ast.walk(ast.parse(inspect.getsource(pow)))
has_power = any(isinstance(node, ast.Pow) for node in nodes)