【问题标题】:How to make a switch statement for a QuerySet in Python如何在 Python 中为 QuerySet 制作 switch 语句
【发布时间】:2017-04-30 21:21:44
【问题描述】:

我一直在阅读一些关于开关替换的帖子,例如:

但它们似乎都不适合我的需要。

我真正想要的是这样的东西

def f(x):
     switch(x):
         case 'pk':
         return User.objects.get(pk=x)
         case: 'email':
         return User.objects.get(email=x)

有没有简单的方法可以做到这一点?

【问题讨论】:

  • 你在写什么,x???
  • 一个简单的if, elif, else 块如何不起作用?任何案例陈述都可以直接翻译成这样。

标签: python function switch-statement case


【解决方案1】:

不完全确定您的意思,但您可以像这样使用 dict 解包:

def f(param, value):
    return User.objects.get(**{param: value})

所以,

f('pk', key)

会回来

User.objects.get(pk=key)

【讨论】:

    【解决方案2】:

    正如他们在上述问题之一中所说:

    直接替换为if/elif/else

    这是一个适合你的例子

    def f(x):
        if x == 'pk':
            return User.objects.get(pk=x)
        elif x == 'email':
            return User.objects.get(email=x)
        elif x == 'address':
            return User.objects.get(address=x)
        else:
            raise ValueError("x must be 'pk', 'email' or 'address'")
    

    【讨论】:

      【解决方案3】:

      试试这个

      def f(x):
       switch = {
                'pk':(lambda val:User.objects.get(pk=val))
                'email':(lambda val:User.objects.get(email=val))
       }
       try:
          return switch[x](x)
       except KeyError:
          return default
      

      def f(x):
        if x in ("pk","email"):
          return User.objects.get(**{x:x})
        return default
      

      【讨论】:

      • 恕我直言,使用 lambdas、dict 和 try-except 只会增加不必要的复杂性
      • 是的,这是过度设计的。只需使用if, elif, else
      【解决方案4】:

      定义

      def custom_switch(value, cases={}, default=None):
          try:
              cases[value]()
          except KeyError:
              if default is not None: default()
      

      用法

      x = 'email'
      custom_switch(x, {
          'pk': lambda: User.object.get(pk=x),
          'email': lambda: User.object.get(email=x)
      }, lambda: print('error!'))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多