You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何在if判断成立时重复执行函数生成不重复caseID

代码修正方案

你现有代码存在两个基础错误需要先修复:

  • 异步函数openuseless()调用时没有加await,会直接返回协程对象而非读取到的caseid列表
  • 原有id重复校验逻辑错误,遍历已有id时只要遇到一个不匹配的id就会执行新增操作,完全不符合需求

正确的实现可以用循环重试逻辑,生成id后校验是否重复,重复就重新生成,直到拿到唯一id后再写入存储:

import json
import string
import random

async def openuseless():
    with open("caseids.json", "r") as f:
        caseids = json.load(f)
    return caseids

async def addcaseidtodb(caseid):
    # 调用异步函数需加await
    e = await openuseless()
    e[str(caseid)] = {}
    with open("caseids.json", "w") as f:
        json.dump(e, f)
    return True

async def id_generator(size=10, chars=string.ascii_uppercase + string.digits):
    while True:
        # 生成随机id
        x = ''.join(random.choice(chars) for _ in range(size))
        # 读取已有id列表
        existing = await openuseless()
        # 直接判断生成的id是否在已有key中,不用循环遍历,查询效率更高
        if x not in existing:
            # 不重复就写入,然后返回有效id
            await addcaseidtodb(x)
            return x
        # 重复的话循环自动进入下一轮重新生成

如果想要用递归实现重试也可以,但不推荐,极端大量重复场景下可能触发递归深度限制:

async def id_generator(size=10, chars=string.ascii_uppercase + string.digits):
    x = ''.join(random.choice(chars) for _ in range(size))
    existing = await openuseless()
    if x in existing:
        # 重复就递归调用自身重新生成
        return await id_generator(size, chars)
    await addcaseidtodb(x)
    return x

补充优化建议

  • 可以给重试加最大次数限制,避免存储已满的情况下进入死循环
  • 每次生成id都读一次文件性能较低,高频率生成场景可以把已有id缓存到内存中,定期和文件同步即可

内容的提问来源于stack exchange,提问作者boredscripter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:15:08