英文:
Is there a way to compare a value against multiple possibilities without repetitive if statements?
问题
我有一个具有多种可能输入的函数,每种输入都会触发不同的函数。
这里的示例代码有效,但它很不好,我不想使用这种代码:
def start(press_type):
    if press_type == "keyboard":
        function1()
    if press_type == "left click":
        function2()
    if press_type == "right click":
        function3()
    if press_type == "middle click":
        function4()
是否有一种方法可以编写该函数,而不重复使用这些 if/else 语句?
我尝试使用字典,但结果很难处理,而且我还有其他具有多个设置选项的参数,所以这种方法最终会变得复杂。
英文:
I have a function with an input that can be of multiple possibilities, and each one triggers a different function.
The example code here works, but it's very bad and I don't want to use this sort of code:
def start(press_type):
    if press_type == "keyboard":
        function1()
    if press_type == "left click":
        function2()
    if press_type == "right click":
        function3()
    if press_type == "middle click":
        function4()
Is there any way to write the function without repeating those if/else statements?
I tried to use a dictionary, but the result was difficult to work with, also, I have a couple other parameters with multiple set options, so this method would end up being convoluted eventually.
答案1
得分: 2
你可以使用模式匹配语句:
def start(press_type):
    match press_type:
        case "keyboard":
            function1()
        case "left clock":
            function2()
        # ...
英文:
You can use a pattern match statement:
def start(press_type):
    match press_type:
        case "keyboard":
            function1()
        case "left clock":
            function2()
        # ...
答案2
得分: 2
def start(press_type):
  match press_type:
    case 'keyboard':
      function1()
    case 'left click':
      function2()
    case 'right click':
      function3()
    case 'middle click':
      function4()
    case _:
      # 默认情况
    # ...等等。
参考链接: 结构模式匹配
英文:
Python 3.10+
def start(press_type):
  match press_type:
    case 'keyboard':
      function1()
    case 'left click':
        function2()
    case 'right click':
        function3()
    case 'middle click':
        function4()
    case _:
      # Default
    # ...and so on.
Reference: Structural Pattern Matching
答案3
得分: 2
我怀疑这个答案可能不太受欢迎,但迄今为止提供的match/case解决方案仅仅利用了Python 3.10中的一个新功能,这在很大程度上并没有真正简化你所暗示的多种选项,可能将来会被使用。
使用传统的字典方法然后为函数添加关键字选项也有其道理。
我认为这种方法不会比match/case方法更简单。(我可能错了!)
一个简单的例子:
def start(press_type, **kwargs):
    func = functions[press_type]
    func(**kwargs)
def function1(**kwargs):
    print("function 1 executed")
def function2(**kwargs):
    print("function 2 executed")
    if kwargs:
        if "key1" in kwargs:
            function21(kwargs["key1"])
        if "key2" in kwargs:
            function21(kwargs["key2"])
        if "key3" in kwargs:
            function23(kwargs["key3"])
        return
    print("    function 2 missing a parameter")
def function3(**kwargs):
    print("function 3 executed")
def function4(**kwargs):
    print("function 4 executed")
def function21(key=None):
    print("    function 21", key)
def function23(key=None):
    print("    function 23", key)
functions = {"keyboard": function1, "left click": function2, "right click": function3, "middle click": function4}
start("left click", key1=1, key2=2, key3=3)
start("keyboard")
start("left click", key1=42, key3="A")
start("right click")
start("left click")
输出:
function 2 executed
    function 21 1
    function 21 2
    function 23 3
function 1 executed
function 2 executed
    function 21 42
    function 23 A
function 3 executed
function 2 executed
    function 2 missing a parameter
英文:
I suspect that this answer will be unpopular but the match/case solutions, so far offered, simply make use of a new feature in python 3.10, which to a large degree doesn't really simplify the multiple options that you imply, may be used in the future.
There is a case for using a traditional dictionary approach and then adding a keywords option to the functions.
I don't see this approach being any less convoluted than the match/case approach. ( I may be wrong! )
A simple example:
def start(press_type, **kwargs):
    func = functions[press_type]
    func(**kwargs)
def function1(**kwargs):
    print("function 1 executed")
def function2(**kwargs):
    print("function 2 executed")
    if kwargs:
        if "key1" in kwargs:
            function21(kwargs["key1"])
        if "key2" in kwargs:
            function21(kwargs["key2"])
        if "key3" in kwargs:
            function23(kwargs["key3"])
        return
    print("    function 2 missing a parameter")
def function3(**kwargs):
    print("function 3 executed")
def function4(**kwargs):
    print("function 4 executed")
def function21(key=None):
    print("    function 21", key)
def function23(key=None):
    print("    function 23", key)
functions = {"keyboard":function1,"left click":function2,"right click":function3,"middle click":function4}
start("left click", key1=1, key2=2, key3=3)
start("keyboard")
start("left click", key1=42, key3="A")
start("right click")
start("left click")
Output:
function 2 executed
    function 21 1
    function 21 2
    function 23 3
function 1 executed
function 2 executed
    function 21 42
    function 23 A
function 3 executed
function 2 executed
    function 2 missing a parameter
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论