在我使用 tg bot 和数据库的代码中,交换功能存在问题。该机器人正在用一些用户硬币交换其他硬币。这是用户模型:
class User:
lucky: Mapped[int] = mapped_column(Integer)
chip: Mapped[int] = mapped_column(Integer)
cash: Mapped[int] = mapped_column(Integer)
这是我的函数,我必须检查参数中作为字符串的硬币交换是否等于某些数据库并执行交换操作。这是代码:
async def trade(callback: CallbackQuery, state: FSMContext):
data = await state.get_data() # here is my data including the number of coins
user = await get_user()
if data['send_coin'] == 'lucky':
if data['get_coin'] == 'cash':
user.lucky -= 10
user.cash += 1
if data['get_coin'] == 'chip':
user.lucky -= 10
user.chip += 5
if data['send_coin'] == 'cash':
# and do it again with the other coin.
我无法用谷歌搜索这个问题,所以我在这里问。
尽可能避免嵌套 if 语句是很好的做法。
从给定的片段中,您有两个硬币(send_coin 和 get coin),然后您根据这两个硬币的组合进行不同的数学计算。
第一种方法简单但丑陋
您可以查看一份声明
if data['send_coin'] == 'lucky' and data['get_coin'] == 'cash'::
user.lucky -= 10
user.cash += 1
elif data['send_coin'] == 'lucky' and data['get_coin'] == 'chip' :
user.lucky -= 10
user.chip += 5
第二种方法
您可以组合 data['send_coin'] 和 data['get_coin'] 创建一行然后检查,适合较短的条件,但随着添加更多条件,可以更容易维护
if dataCombined == "luckycash":
#do math here
elif dataCombined == "luckychip":
#do math here
第三种方法 对于简单的条件来说,这可能会很麻烦,但对于更大的系统来说可能会更好
提取应用逻辑 假设您需要根据您获得的硬币类型设置值
if data['get_coin'] == 'cash':
luckyVal = 10
cashVal = 1
elif data['get_coin'] == 'chip':
luckyVal = 10
chipVal = 5
并且您需要根据发送硬币的类型增加或减少价值
if data['send_coin'] == 'cash':
luckySign = -1
cashSign = 1
elif data['sen_coin'] == 'chip':
luckySign = 1
cashSign= -1
然后您可以应用更改来更新值
user.lucky += luckySign*luckyVal
user.cash += cashSign* chipVal
此方法可以更轻松地添加不同条件