在python中使用dict作为开关语句
我试图使用字典作为switch语句,从用户输入调用各种方法。然而,似乎正在发生的事情是,无论用户选择什么方法,它都会按照它们在我的字典中列出的顺序遍历所有方法,而不是在特定的方法调用之后退出 我是Python新手,使用过JAVA,它有一个switch语句,并且能够在开关内部使用break关键字,而Python没有 我一直在钻研stackoverflow和google,在我的特殊问题上没有任何运气,所以任何帮助都将不胜感激 完整代码如下:在python中使用dict作为开关语句,python,mysql,dictionary,switch-statement,Python,Mysql,Dictionary,Switch Statement,我试图使用字典作为switch语句,从用户输入调用各种方法。然而,似乎正在发生的事情是,无论用户选择什么方法,它都会按照它们在我的字典中列出的顺序遍历所有方法,而不是在特定的方法调用之后退出 我是Python新手,使用过JAVA,它有一个switch语句,并且能够在开关内部使用break关键字,而Python没有 我一直在钻研stackoverflow和google,在我的特殊问题上没有任何运气,所以任何帮助都将不胜感激 完整代码如下: import pymysql # Open DB db
import pymysql
# Open DB
db = pymysql.connect()
# Prepare a cursor object using cursor() method
cursor = db.cursor()
# Create a Student Table
cursor.execute("DROP TABLE IF EXISTS Student")
cursor.execute("CREATE TABLE Student(Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(25))")
# Method for inserting new student mySQL
def insert() :
name = input('Enter the Students name: ')
instatmt = "INSERT INTO Student VALUES(NULL, '%s')" % (name)
cursor.execute(instatmt)
db.commit()
return(print("Successfully inserted student"))
# Method for updating a student record mySQL
def update() :
name = input('Enter the Students name: ')
update = input('Enter the Updated name: ')
upstatmt = "UPDATE Student SET Name='%s' WHERE Name='%s'" % (update, name)
cursor.execute(upstatmt)
db.commit()
return(print("Successfully updated object"))
# Method for deleting a student record mySQL
def delete() :
name = input('Enter the Students name: ')
delstatmt = "DELETE FROM Student WHERE Name ='%s'" % (name)
cursor.execute(delstatmt)
db.commit()
return(print("Successfully deleted object"))
# Method for retrieving a student record mySQL
def retrieve() :
name = input('Enter the Students name: ')
retstatmt = "SELECT * FROM Student WHERE Name ='%s'" % (name)
display = cursor.execute(retstatmt)
print(display)
return(print("Object Retrieved..."))
# Call method requested by user
def performAction(argument):
switcher = {
'I': insert(),
'U': update(),
'D': delete(),
'R': retrieve(),
'E': exit
}
func = switcher.get(argument, lambda: "Invalid Entry")
print (func)
# while True :
action = input('Which Operation would you like to perform ( I : Insert, U : Update, D: Delete, R: Retrieve, E: Exit): ')
performAction(action)
# disconnect from server
db.close()
您正在调用函数,而不是将它们插入字典。试试这个:
def performAction(argument):
switcher = {
'I': insert,
'U': update,
'D': delete,
'R': retrieve,
'E': exit
}
func = switcher.get(argument, lambda: "Invalid Entry")
result = func()
print (func, result)
您正在调用函数,而不是将它们插入字典。试试这个:
def performAction(argument):
switcher = {
'I': insert,
'U': update,
'D': delete,
'R': retrieve,
'E': exit
}
func = switcher.get(argument, lambda: "Invalid Entry")
result = func()
print (func, result)
您正在调用字典中的函数,因此它们都是连续执行的,然后再也不会执行。要解决此问题,请删除括号:
def performAction(argument):
switcher = {
'I': insert,
'U': update,
'D': delete,
'R': retrieve,
'E': exit
}
func = switcher.get(argument, lambda: print("Invalid Entry"))
func()
虽然这是可行的,但这是一种非常规的方法
尝试这样做,并且可以以更可读的方式编写:
def performAction(argument):
if argument == 'I':
insert()
elif argument == 'U':
update()
elif argument == 'D':
delete()
elif argument == 'R':
retrieve()
elif argument == 'E':
exit()
else:
print("Invalid Entry")
Python不是Java,所以没有必要假装它是。您在字典中调用函数,所以它们都是连续执行的,然后再也不会执行了。要解决此问题,请删除括号:
def performAction(argument):
switcher = {
'I': insert,
'U': update,
'D': delete,
'R': retrieve,
'E': exit
}
func = switcher.get(argument, lambda: print("Invalid Entry"))
func()
虽然这是可行的,但这是一种非常规的方法
尝试这样做,并且可以以更可读的方式编写:
def performAction(argument):
if argument == 'I':
insert()
elif argument == 'U':
update()
elif argument == 'D':
delete()
elif argument == 'R':
retrieve()
elif argument == 'E':
exit()
else:
print("Invalid Entry")
Python不是Java,所以不需要假装它是。使用参数运行程序 updatedb.py-操作插入更多 action=input'您希望执行哪个操作I:Insert、U:Update、D:Delete、R:Retrieve、E:Exit:' 取而代之
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-action", dest="action", nargs=1, default="exit", choices=['insert', 'exit', 'delete'], type=str)
args = parser.parse_args()
>>> args
Namespace(action='insert')
>>> args.action
'insert'
表演动作
取而代之
您可以使用eval调用func
result = eval(args.action)
使用参数运行程序 updatedb.py-操作插入更多 action=input'您希望执行哪个操作I:Insert、U:Update、D:Delete、R:Retrieve、E:Exit:' 取而代之
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-action", dest="action", nargs=1, default="exit", choices=['insert', 'exit', 'delete'], type=str)
args = parser.parse_args()
>>> args
Namespace(action='insert')
>>> args.action
'insert'
表演动作
取而代之
您可以使用eval调用func
result = eval(args.action)
您正在调用函数,而不是引用函数。代替插入,不插入括号。“I”:插入将返回一个dict,其中dict['I']=插入的结果,您需要改为I:insert,然后像swither['I']一样调用您正在调用函数,而不是引用函数。使用插入代替插入,不插入括号。“I”:插入将返回一个dict,其中dict['I']=插入的结果,您需要改为I:insert,然后像swither['I']一样调用,如果func!='无效输入'else none谢谢您的帮助,我调用函数时疏忽了@亚历山大——也许吧。但是我认为,让dict.get返回一个默认的可调用项可以使代码更具可读性无效输入'else none谢谢您的帮助,我调用函数时疏忽了@亚历山大——也许吧。但是我认为让dict.get返回一个默认的可调用函数可以使代码更具可读性。我不认为这是一个非常规的做法。它只是一个由来已久的跳转表。@tdelaney它是一个用作switch语句的python dict。关于这一点,没有什么是正常的或pythonic的。使用elif,因为这些值是互斥的。您的else:仅附加到最后一个if,因此当输入前4个操作之一时,它将打印无效的条目。@t请在代码审阅期间询问任何经验丰富的开发人员他们更喜欢哪一个。99/100开发者会说使用if语句,而不是非常规的字典方法。我不认为这是非常规的。它只是一个由来已久的跳转表。@tdelaney它是一个用作switch语句的python dict。关于这一点,没有什么是正常的或pythonic的。使用elif,因为这些值是互斥的。您的else:仅附加到最后一个if,因此当输入前4个操作之一时,它将打印无效的条目。@t请在代码审阅期间询问任何经验丰富的开发人员他们更喜欢哪一个。99/100开发人员会说使用if语句,而不是非传统的字典方法。