在这种情况下,不使用带字典的eval()更好的方法吗?

Bug*_*mon 0 python dictionary eval

下面的两个函数对两个整数执行算术运算并返回整数结果.

我听说很多关于eval()的使用非常糟糕,因为它会导致很多问题.但是看看下面我写的代码,看起来eval()可以省去很多行代码,对吧?

def dict_calculate(operation, num1, num2):
    operations = {'add': '+', 'subtract': '-', 'multiply': '*', 'divide': '//'}
    return eval(str(num1) + operations[operation] + str(num2))

def conditional_calculate(operation, num1, num2):
    if operation == 'add':
        return num1 + num2
    if operation == 'subtract':
        return num1 - num2
    if operation == 'multiply':
        return num1 * num2
    if operation == 'divide':
        return num1 // num2

if __name__ == "__main__":
    x = 10
    y = 5

    print(str(dict_calculate('add', x, y)) + ', ', end='')
    print(str(dict_calculate('subtract', x, y)) + ', ', end='')
    print(str(dict_calculate('multiply', x, y)) + ', ', end='')
    print(str(dict_calculate('divide', x, y)))

    print(str(conditional_calculate('add', x, y)) + ', ', end='')
    print(str(conditional_calculate('subtract', x, y)) + ', ', end='')
    print(str(conditional_calculate('multiply', x, y)) + ', ', end='')
    print(str(conditional_calculate('divide', x, y)))
Run Code Online (Sandbox Code Playgroud)

两种功能的输出相同

15, 5, 50, 2
15, 5, 50, 2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,eval最好不能使用吗?如果没有,是否有比eval()更好的方法来实现相同类型的代码效率?

非常感谢.

Jul*_*nck 5

你可以这样做:

import operator
def dict_calculate(operation, num1, num2):
    operations = {'add': operator.add,
                  'subtract': operator.sub,
                  'multiply': operator.mul,
                  'divide': operator.floordiv}
    return operations[operation](num1, num2)
Run Code Online (Sandbox Code Playgroud)

如果您不想导入其他模块,可以执行以下操作:

def dict_calculate(operation, num1, num2):
    operations = {'add': '__add__',
                  'subtract': '__sub__',
                  'multiply': '__mul__',
                  'divide': '__floordiv__'}
    return getattr(num1, operations[operation])(num2)
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,所以我想这里的智慧是只使用带字典的辅助函数,而不是直接评估运算符的字符串版本.非常感谢. (2认同)