2012-08-30 13 views
0

使用active_directory模塊有一個奇怪的問題,這是驚人的BTW ...真棒包裝。python: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") 

它不斷想出無...我希望它返回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 ...爲什麼它不會返回值?!?!打印uname作品,但返回uname返回無!

請幫忙!

感謝所有,

蘭迪

回答

2

它沒有返回SaSmith因爲遞歸部分沒有被退回,所以如果x是真實的函數返回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 

注意:如果active_directory.find_user(fname[:n]_lname)對於每n爲真,則第一行可防止無限循環。

我同意@Randall使用for循環可能更具可讀性,它在上述情況下返回None

+0

謝謝@hayden,這使得很多感! –

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")