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
相关产品推荐
相关产品推荐

