python中case的⽤法_⽤Python实现简单的switchcase语句在Python中是没有Switch / Case语句的,很多⼈认为这种语句不够优雅灵活,在Python中⽤字典来处理多条件匹配问题字典会更简单⾼效,对于有⼀定经验的Python玩家不得不承认,的确如此。
但今天我们还是来看看如果⼀定要⽤Python来Switch / Case,可以怎么玩。
语法约束
我们先定义⼀下Switch/Case应该怎么表达,为了简单我们可以让它长成这样。
def cn():
print('cn')
def us():
print('us')
switch(lang).case('cn',cn)
.case('us',us)
.default(us)
类实现⼀
通过以上约束,我们可以把switch当成⼀个类来实现,传⼊的参数在构造函数⾥处理,然后再分别实现case和default⽅法即可。
class switch(object):
def __init__(self, case_path):
self.switch_to = case_path
switch函数用法举例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)
>>> cn
switch('us').case('cn',cn).case('us',us).default(fail)
>>> cn
switch('jp').case('cn',cn).case('us',us).default(fail)
>>> fail
switch('cn').case('cn',cn).case('us',us)
>>> cn
让我们来看⼏个奇葩⼀点的case。
# duplicate case
switch('us').case('us',cn).case('us',us).default(fail)
>>> cn
def cn() return 'cn'
def us() return 'us'
# return value
result = switch('cn').case('cn',cn).case('us',us)
result
>>>
发现了没有,上⾯的实现不会处理重复的case,当然你可以加强⼀下case⽅法,最好是抛出异常,其他编程语⾔通常都这样做。
第⼆个问题,你希望从case⾥拿到返回值,像上⾯的写法是没希望了,因为扔掉了。我们可以考虑在switch类⾥加⼀个result的变量来保存执⾏结果。
class switch(object):
def __init__(self, case_path):
...
def case(self, key, method):
...
...
在调⽤结束后,就可以通过result拿到结果了。
_ = switch('cn').case('cn',cn).case('us',us)
_.result
>>> cn
类实现⼆
我⼤概在⽹上搜了⼀下,你还可以参考Brian Beck通过类来实现Swich/Case。
class switch(object):
def __init__(self, value):
self.value = value
self.fall = False
def __iter__(self):
"""Return the match method once, then stop"""
yield self.match
raise StopIteration
def match(self, *args):
"""Indicate whether or not to enter a case suite"""
if self.fall or not args:
return True
elif self.value in args:
self.fall = True
return True
else:
return False
c = 'z'
for case in switch(c):
if case('a'): pass # only necessary if the rest of the suite is empty
if case('c'): pass
# ...
if case('y'): pass
if case('z'):
print("c is lowercase!")
break
if case('A'): pass
# ...
if case('Z'):
print("c is uppercase!")
break
if case(): # default
print("I dunno what c was!")
这种实现相对复杂⼀点,⽽且⽤起来也不是很舒服,⼜需要for⼜需要if(还不如直接if/else痛快)。当然也有好处,就是可以把相同结果的case放⼀起,⽽且case⾥可以写更多东西,不仅仅是⼀个⽅法名。
写在最后
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论