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

在Python中将参数作为菜单传递给字典中调用的函数,python,dictionary,Python,Dictionary,我被要求创建一个简单的脚本,将数据从一个数据库传输到另一个数据库,并尽可能使其参数化,包括允许用户选择操作的选择性菜单 正如您所知,Python没有开关大小写语句,您可以使用if elif…else链或使用字典来模拟菜单 我选择了字典,因为它有一种更优雅的方式: options = { 1: ('Create temp table', create_tmp_table), 2: ('Write data in temp table', copy_to_temp),

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

正如您所知,Python没有开关大小写语句,您可以使用if elif…else链或使用字典来模拟菜单

我选择了字典,因为它有一种更优雅的方式:

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)
    }
我的问题来了。从代码中可以看到,我有一个函数,它创建了一个支持表,并将脚本开头询问的配置文件字段作为参数

当我调用函数时:

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]
例如,选择操作1,它不会什么都没有。我相信,如果不向函数传递任何参数(显然),它将什么也不做。 那么,如何给出正确调用函数的参数:

def create_tmp_table(*varargs):
    name = raw_input('Scegli un nome per la tabella d\'appoggio')
    query = """ CREATE TABLE {0} (
                      SOME 
                      COLUMNS
                    );
                """.format(name)
    varargs[0].execute(query)
    varargs[1].commit()
以下是一个简单的输出:

数据库传输

1-创建临时表

2-在临时表中写入数据

3-将数据从临时表传送到最终表

4-删除临时表

5-出口

选择一个操作:1


退出代码为0的过程结束了如果我正确理解了您的问题,您所需要做的就是调用函数,而不是将其分配给变量。换言之,替换:

func= options[choice][1]
与:


如果我正确理解了您的问题,那么您所需要做的就是调用函数,而不是将其分配给变量。换言之,替换:

func= options[choice][1]
与:


使用字典分派方法的工作原理如下:

def foo(arg1, arg2):
    ... some code ...

def bar(arg1, arg2):
    ... some code ...

dispatcher = {'option 1': foo,
              'option 2': bar}

selected_option = 'option 1'
arg1 = 'my first arg'
arg2 = 'my second arg'

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


如其中一条注释所示,确保键在字典中。看起来您使用用户输入字符串从dict中进行选择,但dict键是INT。

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

def foo(arg1, arg2):
    ... some code ...

def bar(arg1, arg2):
    ... some code ...

dispatcher = {'option 1': foo,
              'option 2': bar}

selected_option = 'option 1'
arg1 = 'my first arg'
arg2 = 'my second arg'

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



如其中一条注释所示,确保键在字典中。看起来您使用用户输入字符串从dict中进行选择,但dict键是INT。

我不确定是否理解您的要求。因此,如果有人选择选项1,您希望调用create_tmp_table函数吗?我将在问题@atirag中添加一个简单的输出:
raw_input
是否可能只返回一个
str
,而dict中的键是
int
s?@AvihooMamka这不仅仅是可能的,这正是内置的
raw_输入所做的,OP需要解决这一问题,可以将输入转换为int或生成字典键字符串。如果在选项中选择:
而不使用
iterkeys
(事实上它可能会更快)。我不确定我是否理解您想要什么。因此,如果有人选择选项1,您希望调用create_tmp_table函数吗?我将在问题@atirag中添加一个简单的输出:
raw_input
是否可能只返回一个
str
,而dict中的键是
int
s?@AvihooMamka这不仅仅是可能的,这正是内置的
raw_输入所做的事情,OP需要通过将输入转换为int或生成字典键字符串来解决这一问题。如果在选项中选择:
而不使用
iterkeys
(事实上它可能会更快)。这是一个复制-粘贴错误。无论如何,它不起作用:(仔细看,似乎您也需要为调用添加一些参数,因为您已经获得了对
varargs[0]
varargs[1]的引用
。您需要使菜单选项之间保持一致,或者只是将它们硬编码到函数本身中。在这种情况下,您希望这两个元素是什么?我想在分派函数时传递参数,但如果我有两个函数要求不同数量的参数,例如第一个o的两个参数ne和三个参数作为第二个参数?你需要一些机制来处理这个问题,因为现在你只需要一个输入。在不知道你的选项与你在问题中提供的有什么不同的情况下,最明显的选择是只传递一组固定的选项,这些选项涵盖了所有情况,其中一些参数只是没有用于某些情况调用。例如,
create_tmp_table
可能会使用前两个参数,
copy_to_temp
可能会使用参数1和3,等等。这是一个复制粘贴错误。无论如何,它不起作用:(仔细看,似乎您也需要为调用添加一些参数,因为您已经获得了对
varargs[0]的引用
varargs[1]
。您需要使菜单选项之间保持一致,或者只是将它们硬编码到函数本身中。在这种情况下,您希望这两个元素是什么?我想在分派函数时传递参数,但如果我有两个函数要求不同数量的参数,例如第一个o的两个参数ne和三个参数作为第二个参数?你需要一些机制来处理这个问题,因为现在你只需要一个输入。在不知道你的选项与你在问题中提供的有什么不同的情况下,最明显的选择是只传递一组固定的选项,这些选项涵盖了所有情况,其中一些参数只是没有用于某些情况调用。例如,
create_tmp_table
可能会使用前两个参数,
copy_to_temp
可能会使用参数1和3,依此类推。事实上,我还有其他f