首页 > 解决方案 > Python:如何避免 exec()?

问题描述

我写了以下函数:

def get_id(arg_a: int, arg_b: int, arg_c: int, arg_d: int) -> str:
    '''Construct some example id for stackoverflow.'''
    if isinstance(arg_a, float):
        arg_a = int(arg_a)
    if isinstance(arg_b, float):
        arg_b = int(arg_b)
    if isinstance(arg_c, float):
        arg_c = int(arg_c)
    if isinstance(arg_d, float):
        arg_d = int(arg_d)
    return f'{arg_a}|{arg_b}|{arg_c}|{arg_d}'

当我开始重构我的程序时,我发现这个函数并没有像我想要的那样以 Python 的方式编写,所以我开始思考,如何重写它。我发现,我可以exec()与 结合使用get_id.__code__.co_varnames,它将提供一个带有函数参数的元组来迭代:

def get_id(arg_a: int, arg_b: int, arg_c: int, arg_d: int) -> str:
    '''Construct some example id for stackoverflow.'''
    for arg in get_id.__code__.co_varnames:
        exec(f'{arg} = int({arg}) if isinstance({arg}, float) else {arg}')
    return f'{arg_a}|{arg_b}|{arg_c}|{arg_d}'

但是后来我发现exec()由于很多原因不建议在生产程序中使用该功能,我理解。但我不知道,用什么来代替exec(). 拜托,你能帮我吗,如何以更一般的方式编写我的函数并且没有exec()函数?

谢谢你的帮助。

标签: pythonexec

解决方案


最直接的方法是这样的:

def get_id(*args: int) -> str:
    return '|'.join(map(str, map(int, args)))

int如果你输入一个through什么都不会发生int(),所以你可以将它应用到浮点数和整数上。

如果您想一一明确列出您的参数:

def get_id(arg_a: int, arg_b: int, arg_c: int, arg_d: int) -> str:
    return '|'.join(map(str, map(int, (arg_a, arg_b, arg_c, arg_d))))

推荐阅读