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 |