将参数传递给字典中调用的函数作为Python中的菜单

时间:2016-12-12 11:40:09

标签: python dictionary

我被要求创建一个简单的脚本,将数据从数据库传输到另一个数据库,并尽可能使其参数化,包括允许用户选择操作的选择性菜单。

如您所知,Python没有 switch-case 语句,您可以使用 if-elif ... else 链或使用的字典

我选择了字典,因为它采用了更优雅的方式:

console.log('external start... waiting 3 seconds');
timeext = Date.now();
while((Date.now() - timeext) < 3000)
  ;

console.log('external end');

这是我的问题。从代码中可以看出,我有一个函数可以创建一个支持表,并将脚本开头的配置文件的字段作为参数。

当我调用该函数时:

options = {
        1: ('Create temp table', create_tmp_table),
        2: ('Write data in temp table', copy_to_temp),
        3: ('Trnasfer data from temp table to final table', copy_into_main_table),
        4: ('Delete temp table', delete_tmp_table),
        5: ('Exit', exit)
    }

例如选择操作1,它什么都没有。我相信没有将任何参数传递给函数(显然),它什么也没做。 那么,我怎样才能给出正确调用函数的参数:

if __name__ == '__main__':

cfg_file = raw_input('Insert configuration file: ')

try:
    params = parse_config_file(cfg_file)
    dbs = init_connection(params.src_config, params.dst_config)
except ConfigParser.Error as e:
    print e
    raise Exception('File Parsing Error')
except psycopg2.DatabaseError as e:
    print e
    raise Exception('Connection Error')
else:
    create_menu()
    choice = raw_input('\nChoose an operation: ')
    if choice in options.iterkeys():
        func= options[choice][1]

这是一个简单的输出:

DB TRANSFER

1 - 创建临时表

2 - 在临时表中写入数据

3 - 从临时表到最终表的Trnasfer数据

4 - 删除临时表

5 - 退出

选择一项操作:1

处理完成,退出代码为0

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您需要做的就是调用函数而不是仅将其分配给变量。换句话说,替换:

func= options[choice][1]

使用:

options[choice][1]()

答案 1 :(得分:1)

使用字典进行方法调度的方式如下:

THEN

您必须调用从字典中获取的函数,这在代码中是缺失的。此外,您必须确保在调用函数时,dict中的函数接受传递给它的参数。

如其中一条评论所示,请确保密钥位于字典中。看起来您使用用户输入字符串从dict中进行选择,但是dict键是整数。