python中的switch case不起作用; 需要另一种模式

Unk*_*wn 4 python design-patterns

我需要一个代码的帮助,我想在python中实现switch case模式,所以就像一些教程所说,我可以使用字典,但这是我的问题:

  # type can be either create or update or .. 
  message = { 'create':msg(some_data),
              'update':msg(other_data)
              # can have more
            }

  return message(type)
Run Code Online (Sandbox Code Playgroud)

但它不适合我,因为some_data或other_data可以是None(如果没有则会引发错误)并且msg函数需要很简单(我不想在其中加入一些条件).

这里的问题是每次执行函数msg()以填充dict,这与开关案例模式不同,后者通常在其他编程语言中不执行代码,case除非它是匹配的.

还有另一种方法可以做到这一点,或者我只需要做,如果elif ...

更新: 感谢您的所有回复,但实际上它更像是这样

message = { 'create': "blabla %s" % msg(some_data),
            'update': "blabla %s" % msg(other_data)
            'delete': "blabla %s" % diff(other_data, some_data)
           }
Run Code Online (Sandbox Code Playgroud)

所以lambda在这里不起作用而且没有调用相同的函数,所以它更像是我需要的真正的开关案例,也许我必须考虑其他模式.

unu*_*tbu 9

message = { 'create':msg(some_data or ''),
            'update':msg(other_data or '')
            # can have more
          }
Run Code Online (Sandbox Code Playgroud)

更好的是,为了防止msg被执行只是为了填补字典:

message = { 'create':(msg,some_data),
            'update':(msg,other_data),
            # can have more
          }
func,data=message[msg_type]
func(data)
Run Code Online (Sandbox Code Playgroud)

现在你可以自由地定义一个更合理的msg函数,它可以处理一个等于的参数None:

def msg(data):
    if data is None: data=''
    ...
Run Code Online (Sandbox Code Playgroud)

  • @Unkown.抱歉.我可以被器官收割机绑架,并在写完X个月后进行手术时阅读该代码.如果你公司里的任何人都读不懂,那只会让我感到生气,因为他们为了生活而编写代码而我却没有.这真是微不足道的东西. (9认同)
  • 如果你要为尽可能低的分母编写代码,那么你总是会遇到这个问题,即使代码是可读的和Pythonic. (6认同)
  • @Unknown,如果那段代码看起来不可读,你需要学会更好地阅读.这是您将找到的最干净的代码,并且很好地使用了函数是第一类对象的事实. (5认同)
  • @Unknown:在某些时候,你真的必须使用正在使用的编程语言来承担基本的知识水平.如果代码使用了该语言的深奥部分,你可以添加一个注释,但那段代码实际上并不是那么难以理解,而且我不是那么多的python家伙. (5认同)

Kir*_*ser 9

听起来你比你需要的更复杂.你想要简单吗?

if mytype == 'create':
    return msg(some_data)
elif mytype == 'update':
    return msg(other_data)
else:
    return msg(default_data)
Run Code Online (Sandbox Code Playgroud)

你不具备使用类型的字典和函数引用,只是因为你可以.有时一个无聊的显式if/else块正是你需要的.即使是团队中最新的程序员也很清楚,并且不会不必要地调用msg().我也愿意打赌,这将比你正在处理的其他解决方案更快,除非案例数量增长并且msg()快速闪电.

  • @Unknown:除非你对它进行基准测试,否则你无法知道.在理想化的情况下,您可以设置一次字典然后重复使用多次,并且有足够的潜在分支来产生明显的开销,dict方法可能更快.如果这些都不是真的,并且您可以优化if/elif块以便首先测试最常见的条件,它实际上可能会更慢. (3认同)