在本地程序中使用 eval()

Use of eval() in local program

我正在用 Python 和 openpyxl 制作一个小程序。我已经创建了一个函数,我想根据条件重用它,我已经看到 eval() 对于攻击者可能的利用来说是危险的。

但是在本地程序中使用eval() 方法,条件不由用户传递,是否危险?您有任何替代方法来修改我的代码并按我想要的方式使用它而不使用 eval() 吗?

函数必须根据特定条件将值从一个或多个列移动到另一个 col/cols。

功能现在不行了,想先弄清楚自己再写。我希望你明白我想做什么。

def move_values_between_cols(col, condition, col_values_to_change, new_col_values):
    wb = load_workbook(file_path)
    ws = wb.active

    for cell in ws[col]:
        if eval(condition):
            for pos in col_values_to_change:
                ws.cell(row=cell.row, column=new_col_values[pos]).value = cell.value

    wb.save(file_path)

编辑:

我收到了 4 或 5 种不同类型的 excel 表格,它们都具有相同的信息字段,但以不同的方式排序,有些还带有额外的列。我需要它们都具有相同的形状。对于每种类型的 excel 我都有一个函数,从它的实际情况到我想要的方式。条件是我写的

函数示例:

def type1():
    function1()
    function2()
    move_values_between_cols('A', 'cell.value is None', ['B','C'], ['D', 'F']):

def type2():
    function2()
    function3()
    move_values_between_cols('C', 'not isinstance(cell.value, str)', ['A','B'], ['D', 'F']):
    

我的建议是将函数传递给 move_values_between_cols 而不是需要计算的字符串。

例如:

move_values_between_cols('A', lambda value: value is None, ['B','C'], ['D', 'F'])

并在 move_values_between_cols 内,用

检查条件
if condition(cell.value):

而不是

if eval(condition):

按照评论中的建议,您可以使用 lambda 函数代替字符串:

def move_values_between_cols(col, filter_func, col_values_to_change, new_col_values):
    wb = load_workbook(file_path)
    ws = wb.active

    for cell in ws[col]:
        if filter_func(cell):
            for pos in col_values_to_change:
                ws.cell(row=cell.row, column=new_col_values[pos]).value = cell.value

    wb.save(file_path)

def type1():
    function1()
    function2()
    move_values_between_cols('A', lambda cell: cell.value is None, ['B','C'], ['D', 'F']):

def type2():
    function2()
    function3()
    move_values_between_cols('C', lambda cell: not isinstance(cell.value, str), ['A','B'], ['D', 'F']):