在Python中将参数作为菜单传递给字典中调用的函数
我被要求创建一个简单的脚本,将数据从一个数据库传输到另一个数据库,并尽可能使其参数化,包括允许用户选择操作的选择性菜单 正如您所知,Python没有开关大小写语句,您可以使用if elif…else链或使用字典来模拟菜单 我选择了字典,因为它有一种更优雅的方式:在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),
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