如何在Python中为QuerySet生成switch语句

如何在Python中为QuerySet生成switch语句,python,function,switch-statement,case,Python,Function,Switch Statement,Case,我一直在阅读一些关于交换机更换的帖子,例如: 但他们似乎都不符合我的需要 我真正想要的是这样的东西 def f(x): switch(x): case 'pk': return User.objects.get(pk=x) case: 'email': return User.objects.get(email=x) 有没有简单的方法可以做到这一点?试试这个 def f(x): switch = {

我一直在阅读一些关于交换机更换的帖子,例如:

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

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

def f(x):
     switch(x):
         case 'pk':
         return User.objects.get(pk=x)
         case: 'email':
         return User.objects.get(email=x)
有没有简单的方法可以做到这一点?

试试这个

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


正如他们在提到的一个问题中所说:

直接替换为
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'")

不完全确定您的意思,但您可以使用dict解包,如下所示:

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

会回来吗

User.objects.get(pk=key)

定义

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!'))
用法

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!'))

你在写什么,
x
??一个简单的
if、elif、else
块怎么不起作用?任何case语句都可以直接翻译成that.imho,使用lambdas、dict和try,只是增加了不必要的复杂性是的,这是过度设计的。只需使用
if、elif和else