第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

計算字符串中的數(shù)學表達式

計算字符串中的數(shù)學表達式

有只小跳蛙 2019-05-30 16:27:53
計算字符串中的數(shù)學表達式stringExp = "2^4"intVal = int(stringExp)      # Expected value: 16這將返回以下錯誤:Traceback (most recent call last):  File "<stdin>", line 1, in <module>ValueError: invalid literal for int()with base 10: '2^4'我知道eval是否有一種更好、更安全的方法來計算存儲在字符串中的數(shù)學表達式?
查看完整描述

3 回答

?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

eval是邪惡的

eval("__import__('os').remove('important file')") # arbitrary commands

eval("9**9**9**9**9**9**9**9", {'__builtins__': None}) # CPU, memory

注意:即使您使用SET__builtins__到None仍然有可能通過內省來爆發(fā):


eval('(1).__class__.__bases__[0].__subclasses__()', {'__builtins__': None})

使用ast

import ast

import operator as op


# supported operators

operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul,

             ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor,

             ast.USub: op.neg}


def eval_expr(expr):

    """

    >>> eval_expr('2^6')

    4

    >>> eval_expr('2**6')

    64

    >>> eval_expr('1 + 2*3**(4^5) / (6 + -7)')

    -5.0

    """

    return eval_(ast.parse(expr, mode='eval').body)


def eval_(node):

    if isinstance(node, ast.Num): # <number>

        return node.n

    elif isinstance(node, ast.BinOp): # <left> <operator> <right>

        return operators[type(node.op)](eval_(node.left), eval_(node.right))

    elif isinstance(node, ast.UnaryOp): # <operator> <operand> e.g., -1

        return operators[type(node.op)](eval_(node.operand))

    else:

        raise TypeError(node)

您可以很容易地限制每個操作或任何中間結果的允許范圍,例如限制輸入參數(shù)a**b:


def power(a, b):

    if any(abs(n) > 100 for n in [a, b]):

        raise ValueError((a,b))

    return op.pow(a, b)

operators[ast.Pow] = power

或者限制中間結果的大?。?/p>


import functools


def limit(max_=None):

    """Return decorator that limits allowed returned values."""

    def decorator(func):

        @functools.wraps(func)

        def wrapper(*args, **kwargs):

            ret = func(*args, **kwargs)

            try:

                mag = abs(ret)

            except TypeError:

                pass # not applicable

            else:

                if mag > max_:

                    raise ValueError(ret)

            return ret

        return wrapper

    return decorator


eval_ = limit(max_=10**100)(eval_)

>>> evil = "__import__('os').remove('important file')"

>>> eval_expr(evil) #doctest:+IGNORE_EXCEPTION_DETAIL

Traceback (most recent call last):

...

TypeError:

>>> eval_expr("9**9")

387420489

>>> eval_expr("9**9**9**9**9**9**9**9") #doctest:+IGNORE_EXCEPTION_DETAIL

Traceback (most recent call last):

...

ValueError:


查看完整回答
反對 回復 2019-05-30
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

一些安全的替代方案eval()sympy.sympify().evalf()*:

*塞佩sympify也是不安全的,根據(jù)以下來自文檔的警告。

警告:請注意,此函數(shù)使用eval,因此不應該用于未經消毒的輸入。


查看完整回答
反對 回復 2019-05-30
  • 3 回答
  • 0 關注
  • 861 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號