如何优化此代码以使其更加pythonic?

时间:2016-04-18 23:48:25

标签: python django

这是我写的代码片段,我认为这不是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更少混乱?

2 个答案:

答案 0 :(得分:2)

假设self._info仅包含nameslug数据,您可以编写如下内容:

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)