这是我写的代码片段,我认为这不是Pythonic,主要是因为if条件阶梯。
此代码段是用于后端处理的自定义类,
def _get_item(self, **kwargs):
""" returns an object if object exists else None"""
return self.model.objects.get_object_or_none(**kwargs)
def get_object(self, info=None):
""" gets an object with given info """
if info:
self._validate_info(info=info)
name = self._info.get('name', '')
slug = self._info.get('slug', '')
if slug:
obj = self._get_item(slug=slug)
elif name:
obj = self._get_item(name=name)
else:
obj = self._get_item(name=name, slug=slug)
if obj:
return obj
这里我需要优化get_object()
方法。 ._validate_info()
验证给定的info
,它基本上检查并存储self._info
中所需的值,这是一个字典,后来用.get()
方法检索。
如何使这个代码Pythonic更少混乱?
答案 0 :(得分:2)
假设self._info
仅包含name
和slug
数据,您可以编写如下内容:
def get_object(self, info=None):
self._validate_info(info)
return self._get_item(**self._info)
再解释一下:
if obj:
return obj
# end of function
相当于:
if obj:
return obj
else:
return None
这与仅仅执行return obj
相同,如果没有测试,则为{假设obj
只有假,如果它是None
)。
答案 1 :(得分:0)
Django 中有一个函数可以帮助您从模型中获取值或返回 404
from Django.shortcuts import get_object_or_404
get_object_or_404(Model, slug=slug)