1

I have been reading a few posts about switch replacements such as:

But none of them seem to fit my need.

What I really want is something like this

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

Is there an easy way for this to be done?

rand0rn
  • 678
  • 2
  • 12
  • 29
Tsuna
  • 2,098
  • 6
  • 24
  • 46

4 Answers4

2

Not completely sure of what you mean, but you could use dict unpacking like this:

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

So,

f('pk', key)

would return

User.objects.get(pk=key)
Thierry Lathuille
  • 23,663
  • 10
  • 44
  • 50
1

As they say in one of the mentioned questions:

The direct replacement is if/elif/else.

Here is an example that fits your case

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'")
matusko
  • 3,487
  • 3
  • 20
  • 31
0

try this

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

or

def f(x):
  if x in ("pk","email"):
    return User.objects.get(**{x:x})
  return default
Mr. A
  • 1,221
  • 18
  • 28
0

Define

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

Usage

x = 'email'
custom_switch(x, {
    'pk': lambda: User.object.get(pk=x),
    'email': lambda: User.object.get(email=x)
}, lambda: print('error!'))
EyuelDK
  • 3,029
  • 2
  • 19
  • 27