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))))
我写了下面的函数:
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))))