python - 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()
函数?
谢谢你的帮助。
解决方案
最直接的方法是这样的:
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))))
推荐阅读
- python - 带有可选参数的 SQLAlchemy 连接
- sql - 如何在 SQL 中加入/合并来自不同表的日期列
- node.js - D3 Sankey节点颜色排列
- sql - SQL执行顺序:它是否存在?
- javascript - 图表 JS:无法使用 Jquery 将饼图重新初始化为甜甜圈或甜甜圈到饼图
- reactjs - 在 useEffect 中处理 forEach 后调用 setstate
- ethereum - 本地 FLuxMonitor:交易中的 FROM 地址错误
- python - Python 不知道俄语字母
- firebase - Flutter Firebase firestore 附加具有唯一 ID 的数据
- label - 使用 Pine 脚本在 TradingView 中标记位置