关于函数:如何在Python中为QuerySet创建switch语句

How to make a switch statement for a QuerySet in Python

我读过一些关于交换机替换的文章,比如:

  • 对于case/switch语句,python等价于什么?
  • 替换python中的switch语句?

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

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

1
2
3
4
5
6
def f(x):
     switch(x):
         case 'pk':
         return User.objects.get(pk=x)
         case: 'email':
         return User.objects.get(email=x)

有什么简单的方法可以做到吗?


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

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

所以,

1
f('pk', key)

会回来

1
User.objects.get(pk=key)

正如他们在其中一个问题中所说:

The direct replacement is if/elif/else.

这是一个适合你的例子

1
2
3
4
5
6
7
8
9
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'")


定义

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

用法

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

试试这个

1
2
3
4
5
6
7
8
9
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

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