我的第一次尝试:
def generate_id():
""" Create unique id of alphanumeric characters """
i = 0
id = ''
while i!=10:
id = id + random.choice(string.ascii_letters + string.digits)
i+=1
if check_unique(id):
return id
id = generate_id()
return id
def check_unique(id):
"""Check if id is unique"""
try:
instances = SomeModel.objects.get(id=id)
except ObjectDoesNotExist:
return True
return False
第二种方式:
def generate_id():
""" Create unique id of alphanumeric characters """
i = 0
id = ''
while i!=10:
id = id + random.choice(string.ascii_letters + string.digits)
i+=1
if check_unique(id):
return id
generate_id()
def check_unique(id):
"""Check if id is unique"""
try:
instances = SomeModel.objects.get(id=id)
except ObjectDoesNotExist:
return True
return False
如果我以 第二种方式 执行此操作,那么生成唯一ID的逻辑不会出错吗?因为我可能会在最后一次通话中丢失id。
我是python的新手,我不知道,但我认为我的recursion
概念看起来搞砸了
答案 0 :(得分:3)
按照您的代码:
if check_unique(id): # If this is `false`, you keep going
return id
generate_id() # Now what? You call the function. Nothing gets returned.
如果要创建唯一ID,请不要使用递归。只需使用while
循环并生成新ID,只要它们不是唯一的:
characters = string.ascii_letters + string.digits
def generate_id(length=10):
return ''.join(random.choice(characters) for i in range(length))
def generate_unique_id(length=10):
id = generate_id(length)
while not check_unique(id):
id = generate_id(length)
return id
答案 1 :(得分:0)
在第二种方式中,你应返回一个generate_id函数的结尾:
return generate_id()
我还建议进行迭代而不是递归调用...在这种情况下看起来更清晰。