首页 > 编程 > Python > 正文

使用 Python 实现简单的 switch/case 语句的方法

2020-02-15 22:59:45
字体:
来源:转载
供稿:网友

在Python中是没有Switch / Case语句的,很多人认为这种语句不够优雅灵活,在Python中用字典来处理多条件匹配问题字典会更简单高效,对于有一定经验的Python玩家不得不承认,的确如此。

但今天我们还是来看看如果一定要用Python来Switch / Case,可以怎么玩。

语法约束

我们先定义一下Switch/Case应该怎么表达,为了简单我们可以让它长成这样。

def cn():  print('cn')def us():  print('us')switch(lang).case('cn',cn)truetruetrue.case('us',us)   .default(us)

类实现一

通过以上约束,我们可以把switch当成一个类来实现,传入的参数在构造函数里处理,然后再分别实现case和default方法即可。

class switch(object):  def __init__(self, case_path):    self.switch_to = case_path    self._invoked = False  def case(self, key, method):    if self.switch_to == key and not self._invoked:      self._invoked = True      method()    return self  def default(self, method):    if not self._invoked:      self._invoked = True      method()

在构造函数中我们记住了 case_path 和执行状态 _invoked ,在 case() 里如果当前的 key 和 switch_to 匹配并且函数没有被执行过,那么就更新 _invoked 并执行对应的方法。在 default() 里检查一下 _invoked ,如果从没执行过,那么就调用 default 分支的函数。

看上去还不错,我们来试用一下。

switch('cn').case('cn',cn).case('us',us).default(fail)>>> cnswitch('us').case('cn',cn).case('us',us).default(fail)>>> cnswitch('jp').case('cn',cn).case('us',us).default(fail)>>> failswitch('cn').case('cn',cn).case('us',us)>>> cn

让我们来看几个奇葩一点的case。

# duplicate caseswitch('us').case('us',cn).case('us',us).default(fail)>>> cndef cn() return 'cn'def us() return 'us'# return valueresult = switch('cn').case('cn',cn).case('us',us)result>>> <python_switch_case.switch object at 0x11034fb70>

发现了没有,上面的实现不会处理重复的case,当然你可以加强一下case方法,最好是抛出异常,其他编程语言通常都这样做。

第二个问题,你希望从case里拿到返回值,像上面的写法是没希望了,因为扔掉了。我们可以考虑在switch类里加一个result的变量来保存执行结果。

class switch(object):  def __init__(self, case_path):    ...    self.result = None  def case(self, key, method):    ...    self.result = method()  ...

在调用结束后,就可以通过 result 拿到结果了。

_ = switch('cn').case('cn',cn).case('us',us)_.result>>> cn

类实现二

我大概在网上搜了一下,你还可以参考 Brian Beck 通过类来实现Swich/Case。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表