【问题标题】:Variable scope problems with dictionaries字典的变量范围问题
【发布时间】:2015-07-03 20:40:13
【问题描述】:

所以我正在创建一个终端程序,允许您创建帐户并登录/注销它们。成功登录后,它会返回一个用户会话函数并在要求用户输入命令时循环。我想创建一个命令字典并将所有命令映射到一个函数,该函数执行我希望该命令执行的操作。我的问题是,有些函数依赖于找出当前用户会话,但用户名变量范围仅在用户会话函数中,所以一旦从字典中运行函数,我需要能够获取 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")

【问题讨论】:

    标签: python variables python-3.x dictionary scope


    【解决方案1】:

    你在声明字典的时候调用了函数,试着把它们存储在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()
    

    【讨论】:

    • 加一个用于使用 lambda。暂时没想到。
    • 现在如果其中一个命令不带任何参数怎么办。或者如果其中一个命令需要多个参数。这将是一个问题。
    猜你喜欢
    • 2016-08-30
    • 2011-11-21
    • 2011-04-13
    • 2011-10-20
    • 2016-06-21
    • 2011-04-10
    • 2011-08-11
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多