1. Python / Говнокод #12013

    −102

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    import datetime, calendar
    
    def first_last_dopw():
        now = datetime.datetime.now()
        week = datetime.date(now.year, now.month, now.day).isocalendar()[1] - 1
        if week is 0:
            day = 31
            week = datetime.date(now.year - 1, 12, day).isocalendar()[1]
            while week == 1:
                day -= 1
                week = datetime.date(now.year - 1, 12, day).isocalendar()[1]
        d = datetime.date(now.year, 1, 1)
        d = d - datetime.timedelta(d.weekday())
        dlt = datetime.timedelta(days = (week - 1) * 7)
        return d + dlt, d + dlt + datetime.timedelta(days = 6)
    
    def first_last_dopm():
        now = datetime.datetime.now()
        month = now.month - 1
        year = now.year
        if month is 0:
            year -= 1
            month = 12
            prev_month = calendar.monthrange(year, month)
        else:
            prev_month = calendar.monthrange(year, month)
        return datetime.date(year, month, 1), datetime.date(year, month, prev_month[1])

    От автора: Писал модуль для вывода статистических данных. Одно из требований состояло в предоставлении сведений за прошлую неделю и прошлый месяц. В результате родились 2 функции. Одна возвращает дату начала и дату конца предыдущей недели, вторая - дату начала и дату конца предыдущего месяца. Обе учитывают хитрый вариант, когда происходит смена года. Изменить функцию так, чтобы она возвращала дату первого и последнего дня текущей недели или дату первого и последнего дня текущего месяца не составит труда.

    Выложено по просьбе одного из наших гостей http://govnokod.ru/11925#comment157657.
    Источник: http://nwskyfox.blogspot.com/2012/07/python.html

    Запостил: bormand, 27 Октября 2012

    Комментарии (18) RSS

    • Спасибо ещё раз :)

      Тот самый гость.
      Ответить
    • показать все, что скрытоПерл и ПХП читабельны, Питон же, имхо, часто выглядит как нагромождение строчных букв.
      Понял в чем дело - как минимум точек с запятой очень для глаза не хватает.
      Ответить
      • Бейсикофортранофоб в треде.
        Ответить
      • Точки с запятой не нужны же. Их не хватает по привычке, но они не нужны.
        Если делать язык с нуля, нужно оставить точку с запятой разделителем однострочной записи, плюс, как опционально для конца строки, но советовать не ставить.
        И тогда случится счастье.
        Ответить
        • Тогда для переноса длинной строки (если нужно красиво отформатировать, чтобы не уезжало за экран) придётся вводить спецзнак, чтобы перенос не считать разделителем.
          Ответить
          • \

            А вообще питон справляется и без знака, если рвать выражение так, чтобы было понятно, что оно на этом не заканчивается.
            Ответить
        • > нужно оставить точку с запятой разделителем однострочной записи, плюс, как опционально для конца строки, но советовать не ставить
          JavaEcmaScript?
          Ответить
        • Любой Си-подобный язык (или даже, скорее Фортрано-подобный) обязательно должен использовать разделители выражений в том или ином виде. Питон / Руби / Жабоскрипт - одинаковое сложнопарсящаеся плохо предсказуемое говно ради которого нужно выеживаться с парсерами, "доправлять" их всякими трюками, чтобы работало.
          О, про Хаскел чет я давно не вспоминал - это говно из той же оперы, только там еще много чего подмешалось, так что на общем фоне почти и не заметно даже.
          Ответить
        • Т.е. если сравнивать, то для Явы парсер пишется в полпинка не задумываясь, и сделать подсветку кода и анализ исходников - проще некуда, ну и соответственно, всякую кодогенерацию и т.п. То что Явисты дураки и не используют такую возможность - ну что ж с них взять... А Питон гораздо сложнее распарсить. Это вообще смешно, что языки, которые в рантайме нужно парсить хуже для этого приспособлены, чем компилируемые.
          Ответить
    • Попробовал переписать говнецо из топика: http://ideone.com/9ulXCI.
      Жду порицаний от опытных питонистов.

      P.S. Жаль, что в питоньей либе нет функции в духе сишарповской AddMonths(). Недавно ваял короткий скрипт на ASP.Net, там эта функция мне очень помогла в вычислении границ прошлого квартала.

      P.P.S. Ideone.com купило машину времени. У них уже 30е число.
      Ответить
      • >У них уже 30е число.
        Притом на разных языках у них разное число.
        Ответить
      • Упринципе ничего так.
        Моё: http://ideone.com/2J3j5Z . Слегка нечитабельно, да. Ну и у автора возвращается date, а не datetime. Но сие мелочь есть.

        Кстати, код автора не работает так, как описано в тексте:
        1. Возвращает даты не для прошлой, а позапрошлой недели.
        2. Таки `хитрый вариант' оказался автору при всех потугах с ифами и циклами не по зубам и не обрабатывается как надо. Для первой или второй (не помню точно, проверяйте) недели года возвращаются вроде верные месяц и число, но год остаётся тем же. Т.е. кагбэ возвращаются даты с конца того же года.

        Тот самый гость.
        Ответить
        • > Кстати, код автора не работает так, как описано в тексте:
          Да, заметил это, когда запустил код на своей машине. А вот на Ideone, из-за их глюка со временем, он показывал правильный ответ ;)
          Ответить
    • Если раньше было нарицание "PHP-Даты", то благодаря %Dmitry Timofeev% появилось "Python - Даты"?
      Ответить
    • >Обе учитывают хитрый вариант, когда происходит смена года.
      Да. Это очень хитрый вариант. Хоть и случается довольно редко.
      А високосные года бывают еще реже - их можно вообще не учитывать. Тем более что следующий ажно через 4 года.
      Ответить
      • > Тем более что следующий ажно через 4 года.
        "А через 4 года я допилю их поддержку, если меня не уволят..." подумал автор кода.
        Ответить
    • > if week is 0
      Атас! http://stackoverflow.com/a/2988271/248296
      Ответить

    Добавить комментарий