折腾:

期间,想要去给一个enum的值判断,实现一定的逻辑

需要用到 switch case

搜:

python switch casedef case1(somearg):

pass

def case2(somearg):

pass

def case3(somearg):

pass

switch={

1: case1,

2: case2,

3: case3

}

switch[case](arg)

def f(x):

return {

‘a’: 1,

‘b’: 2,

}.get(x, 9)    # 9 is default if x not found

其他语言中,switch语句大概是这样的

switch (var)

{

case value1: do_some_stuff1();

case value2: do_some_stuff2();

case valueN: do_some_stuffN();

default: do_default_stuff();

}

而python本身没有switch语句,解决方法有以下3种:

A.使用dictionary

values = {

value1: do_some_stuff1,

value2: do_some_stuff2,

valueN: do_some_stuffN,

}

values.get(var, do_default_stuff)()

这个方法的缺点是:我不知道do_some_stuff是不是允许多个语句,如何实现,

也许是可以的,我不知道-.-

B.使用lambda

在PHP中,

switch ($value) {

case ‘a’:

$result = $x * 5;

break;

case ‘b’:

$result = $x + 7;

break;

case ‘c’:

$result = $x – 2;

break;

}

在python中:

result = {

‘a’: lambda x: x * 5,

‘b’: lambda x: x + 7,

‘c’: lambda x: x – 2

}[value](x)

C.Brian Beck提供了一个类 switch 来实现其他语言中switch的功能

# This class provides the functionality we want. You only need to look at

# this if you want to know how this works. It only needs to be defined

# once, no need to muck around with its internals.

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: # changed for v1.5, see below

self.fall = True

return True

else:

return False

# The following example is pretty much the exact use-case of a dictionary,

# but is included for its simplicity. Note that you can include statements

# in each suite.

v = ‘ten’

for case in switch(v):

if case(‘one’):

print 1

break

if case(‘two’):

print 2

break

if case(‘ten’):

print 10

break

if case(‘eleven’):

print 11

break

if case(): # default, could also just omit condition or ‘if True’

print “something else!”

# No need to break here, it’ll stop anyway

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐