我被要求创建一个简单的脚本,将数据从数据库传输到另一个数据库,并尽可能使其参数化,包括允许用户选择操作的选择性菜单。
如您所知,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
答案 0 :(得分:1)
如果我正确理解您的问题,您需要做的就是调用函数而不是仅将其分配给变量。换句话说,替换:
func= options[choice][1]
使用:
options[choice][1]()
答案 1 :(得分:1)
使用字典进行方法调度的方式如下:
THEN
您必须调用从字典中获取的函数,这在代码中是缺失的。此外,您必须确保在调用函数时,dict中的函数接受传递给它的参数。
如其中一条评论所示,请确保密钥位于字典中。看起来您使用用户输入字符串从dict中进行选择,但是dict键是整数。