LINUX.ORG.RU

python3. Вопрос по синтаксису. Как принято писать у опытных разработчиков? else нужно в данном случае или нет?

 


0

1

Привет.

Есть тупой вопрос, который меня беспокоит. Есть функция, которая возвращает True, если переменная requests содержит слово «Next», иначе вернёт False.

Можно записать с явным указанием else:

def get_next_page(requests):
    """Does next page exist?"""
    if requests.text.find("Next") != -1:
        return True
    else:
        return False

А можно без else, результат будет одинаковым:

def get_next_page(requests):
    """Does next page exist?"""
    if requests.text.find("Next") != -1:
        return True
    return False

Какой вариант наиболее предпочтительный?

★★★

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

По-моему, стало лучше.

Было:

def get_requests(cookie, req_type):
    """get first page"""
    page_number = 1
    need_next = True
    if req_type == "wishlist":
        print("Working with wishlist...")
        while need_next:
            try:
                r = requests.get(f"https://www.steamgifts.com/giveaways/search?page={page_number}&type=wishlist",cookies=cookie, headers=headers)
                get_game_links(r)
                need_next = get_next_page(r)
                page_number += 1
                time.sleep(random.randint(3, 7))
            except:
                print("Site is not available")
                time.sleep(300)
                break

def get_next_page(requests):
    """Does next page exist?"""
    if requests.text.find("Next") != -1:
        return True
    else:
        return False

Стало:

def get_requests(cookie, req_type):
    """get first page"""
    page_number = 1
    need_next = True
    if req_type == "wishlist":
        print("Working with wishlist...")
        while need_next:
            try:
                r = requests.get(f"https://www.steamgifts.com/giveaways/search?page={page_number}&type=wishlist",cookies=cookie, headers=headers)
                get_game_links(r)
                need_next = r.text.find("Next") != -1
                page_number += 1
                time.sleep(random.randint(3, 7))
            except:
                print("Site is not available")
                time.sleep(300)
                break

Функцию дропнул полностью.

Сейчас думаю, делать ли так:

def get_requests(cookie, req_type):
    """get first page"""
    page_number = 1
    if req_type == "wishlist":
        print("Working with wishlist...")
        while True:
            try:
                r = requests.get(f"https://www.steamgifts.com/giveaways/search?page={page_number}&type=wishlist",cookies=cookie, headers=headers)
                get_game_links(r)
                if r.text.find("Next") == -1:
                    break
                page_number += 1
                time.sleep(random.randint(3, 7))
            except:
                print("Site is not available")
                time.sleep(300)
                break

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

Почему человеко-боты пишут очевидно лишние конструкции? Будто прямо не понимают код, когда пишут, а карго-копируют непонятную им структуру из шаблонных наборов операторов где-то увиденную.

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

Нехрен из requests возвращать -1. А не лепить поверх этого костыли.

anonymous
()

Если тело функции никогда, вот прям вообще никогда и ни за что не разрастется, а таким тривиальным и останется, то второй вариант сгодится.
Если проверка покрывает 0,000000000001 юзкейс, то также нелогично загонять всё тело функции в ветку else.

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

Virtuos86 ★★★★★
()

pylint обматерит первое как no-else-return и правильно сделает. Это более заметно когда у тебя больше строк после этого if: меньше вложенность же.

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

try:
except

это что-то совсем плохо. Во-первых, это довольно дорогая конструкция и городить везде - плохая идея. Во-вторых, у тебя в блоке try не только попытка установки соединения, но и куча другой логики, соответственно, для любой ошибки будет «Site is not available».

У ответа еще стоит проверять http-код

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

Все нормально: говно к говну.

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

Почему человеко-боты пишут очевидно лишние конструкции? Будто прямо не понимают код, когда пишут, а карго-копируют непонятную им структуру

Представь себе, внатуре не понимают. Таких валом в индустрии. Ни школа, ни институт не учат их понимать смысл: скопировал, жопка к жопке приладил, ошибки подпер костылем - всё, я у мамки бэкенд-разработчик.
Я вот вчера скачал очередное творение https://github.com/prompt-toolkit/pypager , родное пролистывание текста в консоле, там 1000 строчек кода, а уже подключение библиотеки six (совместимость с Py2), и оно не работает ни с одной ревизией prompt_toolkit, которую я попытался скачать с гитлаба, хотя в setup.py указано 'prompt_toolkit>=2.0.0,<2.1.0'.
До сих пор весь скачанный с гитлаба код на питоне, созданный не в рамках крупного проекта кучей людей, делился на две категории: плохой код, и отвратительно плохой код. Хочешь хороший код? Напиши его сам.

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

И-и-и это правильный ответ. Условная операция «in», являющаяся тупо вызовом PySequence_Contains, проверяет наличие __contains__ в объекте поиска, а при его отсутствии откатывается к поиску в итераторе PyObject_GetIter, создаваемом через __iter__ или инкапсуляцию__getitem__.
Так или иначе, __contains__ для строк и массивов байтов реализовано, и возвращает наличие подстроки при помощи PyUnicode_Contains -> ucs1lib_find/ucs2lib_find/ucs4lib_find(buf1, len1, buf2, len2, 0) != -1.

byko3y ★★★★
()

Какой вариант наиболее предпочтительный?

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

I-Love-Microsoft ★★★★★
()

Вернуть булеан из одной единственного условия

def foo():
    return x == y

Если функция завершается при условии

def foo():
    if x == y:
        return x

    if not is_allowed:
        raise Exception

    ...

    return result

Иначе else

anonymous
()

Как принято писать у опытных разработчиков?

Как вариант: с комментариями...

Deleted
()
 def get_next_page(requests):
    ...
    return True

Предлагаю забанить этого нехорошего человека

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

Потому, что анализаторы не научились еще проверять адекватность наименования переменных, а люди, пишущие код, еще не достаточно интеллектуально развились, чтобы адекватно именовать.

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