LINUX.ORG.RU

Python, как красивее написать

 ,


0

3

Привет, есть такой у меня код:

try:
    context['header_photo'] = AdPhoto.objects \
        .filter(ad=self.post, main=True)[:1][0]
except:
    try:
        context['header_photo'] = AdPhoto.objects \
            .filter(ad=self.post)[:1][0]
    except:
        context['header_photo'] = None

Он работает, но он мне не нравится, не красивый какой-то, как лучше сделать?

★★★

Тут 2 проверки, потому в этом случае точно не знаю как бы заменить, а вообще глянь вот тут Пример:

d = {}
d.setdefault('one', []).append('two')
In [4]: d
Out[4]: {'one': ['two']
можно упростить, в общем. Если значения нет, то будет None, как в последнем except.

conformist ★★★
()
ad_photos = AdPhoto.objects.filter(ad=self.post)
if ad_photos.exists():
    if ad_photos.filter(main=True).exists():
        ad_photos = ad_photos.filter(main=True)
    context['header_photo'] = ad_photos.first()
else:
    context['header_photo'] = None

Как вариант. Правда БД дергается на 1 раз больше.

templarrr ★★★★★
()

Во-первых пойми уже наконец то ограничение длинны строки — атавизм рака хипстеров.
Во-вторых в ecxept надо обязательно указывать что эксцептать, а не просто всё подряд.
В-третьих для выборки одного объекта нужно get использовать в случае с обработкой исключения.
В-четвёртых [:1][0] это какой-то бздец, гет и [0] от фильтра вернут то же самое.

Код за тебя писать не хочется, давай сам.

Goury ★★★★★
()
Ответ на: комментарий от Goury

В-третьих для выборки одного объекта нужно get использовать в случае с обработкой исключения.

Нет, .first(). MultipleObjectsReturned — не исключительная ситуация.

x3al ★★★★★
()
Ответ на: комментарий от Int64

ну тогда фильтрай, но тогда исключений быть не должно вообще

Goury ★★★★★
()
Ответ на: комментарий от Goury

Затенять stdlib'овую функцию локальной переменной? Идея лучше, но назвать переменную надо по-другому.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Да, подбором названия я не парился. Хотя если оно в скопе дефа — проблем не будет

Goury ★★★★★
()
Последнее исправление: Goury (всего исправлений: 1)
Ответ на: комментарий от Goury

Супер, не знал что так можно делать :) спасибо всем большое.

Int64 ★★★
() автор топика
Ответ на: комментарий от Goury

Во-первых пойми уже наконец то ограничение длинны строки — атавизм рака хипстеров.

тот же pep8/pyflakes будет ругаться на строку длиннее 79 символов

buratino ★★★★★
()
Ответ на: комментарий от buratino

но в PEP8 написано английским по белому:

This document gives coding conventions for the Python code comprising the standard library in the main Python distribution.

The standard library in the main Python distribution БЛДЖАД.
Хватит уже дрочить на него как на священную корову, в питоне его приняли исключительно потому, что толпа кривожопых хипстеров иначе не может между собой договоритсья. Если у тебя не толпа кривожопых хипстеров код пишет — не надо, блджад, пихать этот пеп в свой проект.

Goury ★★★★★
()
Ответ на: комментарий от x3al

И гуглегайд тоже не имеет отношения ни к чему кроме проектов гугля. Купите уже в магазине голову и думайте ей.

Goury ★★★★★
()
Последнее исправление: Goury (всего исправлений: 1)
Ответ на: комментарий от x3al

мне наплевать, что там написано. я отвечал на вполне конкретную претензию (написанную, правда, на нерусском языке, поэтому я мало что понял, больше догадался) «откуда вы взяли, что нельзя длинных строк?». я и указал, откуда.

buratino ★★★★★
()
Ответ на: комментарий от buratino

Some teams strongly prefer a longer line length. For code maintained exclusively or primarily by a team that can reach agreement on this issue, it is okay to increase the nominal line length from 80 to 100 characters (effectively increasing the maximum length to 99 characters), provided that comments and docstrings are still wrapped at 72 characters.

Я обычно сам с собой договариваюсь на сто.

Deleted
()
Ответ на: комментарий от Deleted

я на 79, причём в любых языках. Помогает думать лаконичными переменными и комментариями, не превышать допустимую вложенность, разрабатывать в тайлинге, а не фуллскине с вкладками.

Deleted
()
Ответ на: комментарий от buratino

https://docs.djangoproject.com/en/1.9/internals/contributing/writing-code/cod...

An exception to PEP 8 is our rules on line lengths. Don’t limit lines of code to 79 characters if it means the code looks significantly uglier or is harder to read. We allow up to 119 characters as this is the width of GitHub code review; anything longer requires horizontal scrolling which makes review more difficult. This check is included when you run flake8.

pawnhearts ★★★★★
()
Ответ на: комментарий от x3al

но ведь это важно для гитхаба, а если я на своей машине делаю? у меня просто действительно громоздкие расчёты, море вложенных циклов.

ZERG ★★★★★
()
Ответ на: комментарий от ZERG

Если море вложенных циклов, значит ты делаешь что-то не правильно. Можно наверное раздробить на отдельные методы.

Int64 ★★★
() автор топика
Ответ на: комментарий от Int64

я бы с радостью, но там весьма специфическая функция внутри, пока никаких идей в голову не пришло

ZERG ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.