0

使用 active_directory 模块时遇到一个奇怪的问题,顺便说一句,这是一个很棒的包装器。

无论如何,我需要确保用户名是唯一的......这是我的功能:

import active_directory

def creative_name(fname, lname, n=1):
    uname = fname[:n] + lname
    x = active_directory.find_user(uname)
    if x: creative_name(fname, lname, n+1)
    else: return uname

if __name__=='__main__':
    print creative_name("Sarah", "Smith")

它不断出现 None ......我希望它返回 uname ......或

fname[:n+1] + lname

这很奇怪,因为如果我像这样运行函数:

def creative_name(fname, lname, n=1):
    uname = fname[:n] + lname
    x = active_directory.find_user(uname)
    if x: creative_name(fname, lname, n+1)
    else: print uname

>>>
SaSmith
>>>

SaSmith 被返回......为什么它不返回值?!?!print uname 有效,但 return uname 返回 None!

请帮忙!

谢谢大家,

兰迪

4

2 回答 2

2

它没有返回SaSmith,因为没有返回递归部分,所以如果x为 true,则函数返回None。添加一个return应该可以解决:

def creative_name(fname, lname, n=1):
    if n > len(fname): return None
    uname = fname[:n] + lname
    x = active_directory.find_user(uname)
    if x: return creative_name(fname, lname, n+1)
    else: return uname

.

注意:第一行防止无限循环 if active_directory.find_user(fname[:n]_lname)is True for each n

我同意@Randall 的观点,即使用for循环可能更具可读性,它None在上述情况下返回。

于 2012-08-30T15:20:26.127 回答
0

哦,伙计……容易多了。

import active_directory

def creative_name(fname, lname):
    for i in range(1,len(fname)):
        uname = fname[:i] + lname
        x = active_directory.find_user(uname)
        if not x: return uname

if __name__=='__main__':
    print creative_name("Sarah", "Smith")
于 2012-08-30T15:14:56.060 回答