带3个变量的开关盒

2024-06-28 19:19:31 发布

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

我可以用三个变量编写switch/case语句来替换此代码吗:

 if where_clause == 0:
   requete(liste_fields,schema,table)
 elif where_clause == 1:
   if like_clause == 0:
     if any_clause == 1:
        requete_where_any(liste_fields,schema,table,wc_1,any_1)
     else:
        requete_where(liste_fields,schema,table,wc_1,wc_2)
   elif like_clause == 1:
        requete_like(liste_fields,schema,table,like_1,like_2)
 elif where_clause == 2:
        requete_double_where(liste_fields,schema,table,wc_1,wc_2,wc_3,wc_4)
 elif where_clause == 3:
        requete_triple_or(liste_fields,schema,table,oc_1,oc_2,oc_3,oc_4,oc_5,oc_6)

Tags: fieldsifschematableclauseanywherelike
2条回答

我换了一门课。它是用值初始化的,一个dict,其中键、值对将每个值的操作表示为一个包含函数、可选参数和可选默认操作的列表。 例如,您应该这样称呼它:

sw = switch(some_value, 
     {
         1:[print, 'hello'], 
         2:[print, 'goodby']
     },
     default=[print])

t默认参数没有参数,所以只需打印新行即可

调用开关时,会调用相应的函数:

sw()

好的方面是switch对象具有__call__方法,因此可以嵌套开关

以下是您案例的实施和应用程序:

class switch(dict):
    def __init__(self, value, cases, default = ((lambda:None),)):
        super().__init__(cases)
        self.default = default
        self.value = value

    def __call__(self):
        do = self.get(self.value, self.default)
        return do[0](*do[1:])

sw = switch(where_clause, 
     {
        0: [requete],
        1: [switch(like_clause, 
            {   
                0: [switch(any_clause, 
                   {   
                       1: [requete_where_any,liste_fields,schema,table, wc_1, any_1]
                   },  
                   default=[requete_where,liste_fields,schema,table, wc_1, wc_2])],

                1: [requete_like,liste_fields,schema,table, like_1, like_2]
            },  
            default=[requete_like,liste_fields,schema,table, like_1, like_2])],

        2: [requete_double_where,liste_fields,schema,table, wc_1, wc_2, wc_3, wc_4),
        3: [requete_triple_or,liste_fields,schema,table, oc_1, oc_2, oc_3, oc_4]    
     })

sw()

该类可以通过在初始化时不传递值和在调用时传递值来轻松改进,例如:

sw = switch( 
     {
         1:[print, 'hello'], 
         2:[print, 'goodby']
     })
sw(1)  # -> 'hello'
sw(2)  # -> 'goodby'

可以使用以下函数定义模拟switch语句:

def switch(v): yield lambda *c:v in c

然后,您的代码可能如下所示:

for case in switch(where_clause):

    if case(0):
       requete(liste_fields,schema,table)
       break

    if case(1):
       for case in switch(like_clause): 
           if case(0):
               if any_clause == 1:
                   requete_where_any(liste_fields,schema,table,wc_1,any_1)
               else:
                   requete_where(liste_fields,schema,table,wc_1,wc_2)
               break

           if case(1):
               requete_like(liste_fields,schema,table,like_1,like_2)
      break
    
   if case(2):
      requete_double_where(liste_fields,schema,table,wc_1,wc_2,wc_3,wc_4)
      break

   if case(3):      
      requete_triple_or(liste_fields,schema,table, oc_1,oc_2,oc_3,oc_4,oc_5,oc_6)
      break 

请注意,您不必使用单词case,您可以选择更有意义的:

for where in switch(where_clause):

    if where(0):
       requete(liste_fields,schema,table)
       break

    if where(1):
       for like in switch(like_clause): 
           if like(0):
               if any_clause == 1:
                   requete_where_any(liste_fields,schema,table,wc_1,any_1)
               else:
                   requete_where(liste_fields,schema,table,wc_1,wc_2)
               break

           if like(1):
               requete_like(liste_fields,schema,table,like_1,like_2)
      break
    
   if where(2):
      requete_double_where(liste_fields,schema,table,wc_1,wc_2,wc_3,wc_4)
      break

   if where(3):      
      requete_triple_or(liste_fields,schema,table, oc_1,oc_2,oc_3,oc_4,oc_5,oc_6)
      break 

相关问题 更多 >