2015-07-03 147 views
-2

所以我創建一個終端程序,允許你創建帳戶和他們的登錄/註銷。一旦您成功登錄,它將返回一個用戶會話函數並在請求用戶輸入命令時循環。我想創建一個命令字典並將所有命令映射到一個函數,該函數可以執行我想要該命令執行的操作。我的問題是,一些函數依賴於計算當前用戶會話,但用戶名變量作用域僅在用戶會話函數中,所以一旦函數從字典中運行,我需要能夠獲取currentuser變量並使用它作爲命令字典中的函數的參數。我只發佈了與此問題有關的代碼部分。如果您需要查看整個代碼,或者有任何問題,請告訴我。謝謝你的幫助。變量範圍問題的字典

commands = { 
    "view mail": view_mail(), 
    "send mail": send_mail(), 
    "logout": True 
} 

def session(currentuser): 
    print("Commands: view mail | send mail | logout") 
    while True: 
     option = input("> ") 
     if option in commands: 
      end_session = commands[option] 
      if end_session: 
       break 
     else: 
      print(option + " is not an option") 

回答

3

您所呼叫的功能,當你聲明的字典,嘗試將它們存儲在commands聲明:

commands = { 
    "view mail": view_mail, 
    "send mail": send_mail, 
    "logout": lambda u: True 
} 

通行證的用戶名在運行時:

end_session = commands[option](username) 

編輯: 那麼如果某些函數沒有參數呢?你可以用僞參數(如上面的lambda),或更好的本事,有簽名您所有的功能:def fun_name(*args):

*args是Python中常見的成語,並指示參數拆包。事情是,它可以是空的,或者它可以包含許多參數。

def multi(*args): 
    p1, p2, p3 = args 

def noargs(*args): 
    pass 

multi(1,2,3) 
noargs() 
+0

加上一個使用拉姆達。我目前從未想到這一點。 –

+0

現在如果其中一個命令沒有任何參數會怎麼樣。或者其中一個命令需要多個參數。這會是一個問題。 –

+0

@banana:見編輯 – cdarke