python中的switch case不起作用;需要其他模式吗

2024-04-20 08:32:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个关于代码的帮助,我想用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)

但是它对我不起作用,因为一些_数据或其他的_数据可以是None(如果没有则会引发错误),msg函数需要很简单(我不想在其中添加一些条件)。在

这里的问题是每次填充dict时都会执行函数msg() 与switch case模式不同,通常在其他编程语言中,除非匹配,否则不会执行case中的代码。在

有别的办法吗?或者我只是需要这样做,如果elif。。。在

更新: 谢谢你的回复,但实际上更像这样

^{pr2}$

所以lambda在这里不起作用,也没有调用相同的函数,所以它更像是我需要的一个真正的开关情况,也许我需要考虑另一种模式。在


Tags: or数据函数代码messagedatatypecreate
3条回答
message = { 'create':msg(some_data or ''),
            'update':msg(other_data or '')
            # can have more
          }

更好的是,为了防止msg仅仅为了填充dict而被执行:

^{pr2}$

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

def msg(data):
    if data is None: data=''
    ...

在我学会python:Readable switch construction without lambdas or dictionaries之前的5年里,我就已经在发明游戏的开关中被淘汰了。哦,好吧。阅读下面的另一种方法。在


这里。有一个switch语句。(加上@martineau的一些不错的清理)

with switch(foo):

    @case(1)
    def _():
        print "1"

    @case(2)
    def _():
        print "2"

    @case(3)
    def _():
        print "3"

    @case(5)
    @case(6)
    def _():
        print '5 and 6'

    @case.default
    def _():
        print 'default'

我将免费扔进(适度)黑客堆栈,滥用装饰器和可疑的上下文管理器。它很难看,但功能(而且不好用)。本质上,它所做的只是用一个难看的包装器包装字典逻辑。在

^{pr2}$

请注意,实际上并不需要黑客堆栈。我们只需使用它来创建一个作用域,这样switch语句中出现的定义就不会泄漏到封闭的作用域中,并使case进入名称空间。如果您不介意泄漏(例如循环泄漏),那么您可以删除堆栈hack并从__enter__返回case装饰器,使用with语句上的as子句在封闭范围内接收它。在

听起来你把这件事复杂化了。你想要简单的吗?在

if mytype == 'create':
    return msg(some_data)
elif mytype == 'update':
    return msg(other_data)
else:
    return msg(default_data)

你不能仅仅因为你能就使用dict和函数引用。有时候,一个无聊的显式的if/else块正是您所需要的。即使是团队中最新的程序员也很清楚,永远不会不必要地调用msg()。我也愿意打赌,这将比您正在使用的其他解决方案更快,除非案例数量增加,msg()的速度非常快。在

相关问题 更多 >