python - 在Python中将 '**'替换为 'math.pow'

标签 python parsing pow

我在文件中有一些数学函数(表示为字符串):

1+a**(b/(3*a+1))
(1+a)**(b/(3*a+1))
...

如何将字符串中的所有 ** 转换为 math.pow

编辑:我想要解决的问题如下: 我有很多这样的功能需要评估,我不能在其中一个上花费太多时间。

有时函数看起来像这样:

(3**100**100**2)

Python尝试对其求值,这很长。 我想要一个错误,例如:

>>> math.pow(3, math.pow(100, 100))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: math range error

编辑2:感谢大家的回答,我终于找到了怎么做,你们的回答和评论对我帮助很大。 我只需在文件顶部强制使用下一行进行 float 除法:

      from __future__ import division

最佳答案

您可以使用以下变压器:

import ast

pow_func = ast.parse("math.pow", mode="eval").body

class PowForDoubleStar(ast.NodeTransformer):
    def visit_BinOp(self, node):
        node.left = self.visit(node.left)
        node.right = self.visit(node.right)

        if isinstance(node.op, ast.Pow):
            node = ast.copy_location(
                       ast.Call(func=pow_func,
                                args=[node.left, node.right],
                                keywords=[]
                               ),
                       node
                   )

        return node

在您的特定示例中,您可以使用执行这些代码部分

for line in file:
    node = ast.parse(line, mode="eval")
    node = PowForDoubleStar().visit(node)
    code = compile(node, "<string>", mode="eval")
    a, b = 1, 3
    result = eval(code)

关于python - 在Python中将 '**'替换为 'math.pow',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17789021/

相关文章:

c++ - 定义一个自制的 pow 函数作为练习

python - 如何对多个字段分组的数量求和?

python - 如何检测 matplotlib 中的双击事件?

parsing - 导入包含混合数据类型的 CSV 文件

java - 保留正则表达式解析的数据

python - 从 python 中的缩进文本文件创建树/深度嵌套字典

c - 递归幂函数 : approach

c++ - 为什么 C++ 认为 8^1/3 = 1?

python - 无需修改第三方代码即可抑制警告

python - 为什么生成的 Python 子进程会在脚本中最后执行的行之后执行?