Python: 如何避免 exec()?

Python: How to avoid exec()?

我写了下面的函数:

def get_id(arg_a: int, arg_b: int, arg_c: int, arg_d: int) -> str:
    '''Construct some example id for Whosebug.'''
    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}'

当我开始重构我的程序时,我发现这个函数并没有像我想要的那样以pythonic方式编写,所以我开始思考,如何重写它。我发现,我可以将 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 Whosebug.'''
    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() 函数?

感谢您的帮助。

最直接的方法是这样的:

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

如果将 int 放入 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))))