如何修改用户输入请求的键值
How to modify a key value from a user inputs request
我正在制作一个基本应用程序,让用户可以添加、删除和编辑他们拥有的股票。我正在努力做到这一点,这样我就可以让用户决定输入 'add' 或 'remove' 并输入它,输入会捕获他们的响应。我不会使用大量的 if user_input = 'add' 做这个然后 elif user_input == 'remove' 做那个。解决这个问题的最佳方法是什么。
这是我编辑库存部分的代码;
def edit_inventory(self):
item_name = input('Enter item name: ')
try:
user_input = input('Type \'ADD\' or \'REMOVE\' to change quantity: ').lower()
if user_input not in ['add', 'remove']:
raise ValueError
quantity = int(input(f'Enter how many you wish to {user_input}: '))
if user_input == 'add':
for item_name in self.stock.keys():
self.stock[item_name] += quantity
elif user_input == 'remove':
for item_name in self.stock.keys():
self.stock[item_name] -= quantity
except KeyError:
print('Item not in stock. Check current stock for current inventory.')
except ValueError:
print('Invalid response.')
我想解决 if 和 elif 问题以提高效率。
一种方法是使用分派 table,如下所示:
def add_item(self, item: str, qty: int) -> None:
self.stock[item] += qty
def remove_item(self, item: str, qty: int) -> None:
self.stock[item] -= qty
def edit_inventory(self) -> None:
cmd_table = {
'add': self.add_item,
'remove': self.remove_item,
}
item = input('Enter item name: ')
cmd = input("Type 'ADD' or 'REMOVE' to change quantity: ").lower()
qty = int(input(f'Enter how many you wish to {cmd}: '))
def invalid_cmd(_item: str, _qty: int) -> None:
print("Invalid response.")
try:
cmd_table.get(cmd, default=invalid_cmd)(item, qty)
except KeyError:
print(
'Item not in stock.',
'Check current stock for current inventory.'
)
这样,如果您有大量命令,则每个命令只需要字典中的一个条目,而不是一堆 if/elif
。您还可以免费获得有关无效条目的合理行为;您可以使用 []
并获得 KeyError
,或者您可以使用 .get()
并提供默认函数,或者您可以测试 if cmd in cmd_table
.
如果您非常具体地只修改项目的数量,您也可以将 int 操作放入 table 并使用它们而不是定义方法:
def edit_inventory(self) -> None:
cmd_table = {
'add': int.__add__,
'remove': int.__sub__,
}
item = input('Enter item name: ')
cmd = input("Type 'ADD' or 'REMOVE' to change quantity: ").lower()
qty = int(input(f'Enter how many you wish to {cmd}: '))
def invalid_cmd(_curr: int, _qty: int) -> None:
print("Invalid response.")
try:
cmd_func = cmd_table.get(cmd, default=invalid_cmd)
self.stock[item] = cmd_func(self.stock[item], qty)
except KeyError:
print(
'Item not in stock.',
'Check current stock for current inventory.'
)
If 的想法与 samwise 相同,但采用的是 class 方法。所以,无论如何我都会 post
def do_this():
print("this")
def do_that():
print("that")
class Command1(dict):
def __call__(self, command: str):
self[command]()
command = input("your command: ")
executor = Command1()
executor["add"] = do_this
executor(command)
class Command2:
my_commands = {"add": do_this, "remove": do_that}
def __call__(self, command: str):
self.my_commands[command]()
command = input("your command: ")
executor = Command2()
executor(command)
这样做的好处是,当您的数据在 class 中时,您只需添加 __call__
方法并扩展接口即可。
我正在制作一个基本应用程序,让用户可以添加、删除和编辑他们拥有的股票。我正在努力做到这一点,这样我就可以让用户决定输入 'add' 或 'remove' 并输入它,输入会捕获他们的响应。我不会使用大量的 if user_input = 'add' 做这个然后 elif user_input == 'remove' 做那个。解决这个问题的最佳方法是什么。
这是我编辑库存部分的代码;
def edit_inventory(self):
item_name = input('Enter item name: ')
try:
user_input = input('Type \'ADD\' or \'REMOVE\' to change quantity: ').lower()
if user_input not in ['add', 'remove']:
raise ValueError
quantity = int(input(f'Enter how many you wish to {user_input}: '))
if user_input == 'add':
for item_name in self.stock.keys():
self.stock[item_name] += quantity
elif user_input == 'remove':
for item_name in self.stock.keys():
self.stock[item_name] -= quantity
except KeyError:
print('Item not in stock. Check current stock for current inventory.')
except ValueError:
print('Invalid response.')
我想解决 if 和 elif 问题以提高效率。
一种方法是使用分派 table,如下所示:
def add_item(self, item: str, qty: int) -> None:
self.stock[item] += qty
def remove_item(self, item: str, qty: int) -> None:
self.stock[item] -= qty
def edit_inventory(self) -> None:
cmd_table = {
'add': self.add_item,
'remove': self.remove_item,
}
item = input('Enter item name: ')
cmd = input("Type 'ADD' or 'REMOVE' to change quantity: ").lower()
qty = int(input(f'Enter how many you wish to {cmd}: '))
def invalid_cmd(_item: str, _qty: int) -> None:
print("Invalid response.")
try:
cmd_table.get(cmd, default=invalid_cmd)(item, qty)
except KeyError:
print(
'Item not in stock.',
'Check current stock for current inventory.'
)
这样,如果您有大量命令,则每个命令只需要字典中的一个条目,而不是一堆 if/elif
。您还可以免费获得有关无效条目的合理行为;您可以使用 []
并获得 KeyError
,或者您可以使用 .get()
并提供默认函数,或者您可以测试 if cmd in cmd_table
.
如果您非常具体地只修改项目的数量,您也可以将 int 操作放入 table 并使用它们而不是定义方法:
def edit_inventory(self) -> None:
cmd_table = {
'add': int.__add__,
'remove': int.__sub__,
}
item = input('Enter item name: ')
cmd = input("Type 'ADD' or 'REMOVE' to change quantity: ").lower()
qty = int(input(f'Enter how many you wish to {cmd}: '))
def invalid_cmd(_curr: int, _qty: int) -> None:
print("Invalid response.")
try:
cmd_func = cmd_table.get(cmd, default=invalid_cmd)
self.stock[item] = cmd_func(self.stock[item], qty)
except KeyError:
print(
'Item not in stock.',
'Check current stock for current inventory.'
)
If 的想法与 samwise 相同,但采用的是 class 方法。所以,无论如何我都会 post
def do_this():
print("this")
def do_that():
print("that")
class Command1(dict):
def __call__(self, command: str):
self[command]()
command = input("your command: ")
executor = Command1()
executor["add"] = do_this
executor(command)
class Command2:
my_commands = {"add": do_this, "remove": do_that}
def __call__(self, command: str):
self.my_commands[command]()
command = input("your command: ")
executor = Command2()
executor(command)
这样做的好处是,当您的数据在 class 中时,您只需添加 __call__
方法并扩展接口即可。