Возвращенные кварталы текущего года

Я создаю эту простую функцию, пытаюсь использовать стиль PEP 8, кое-что, что я обнаружил недавно благодаря этому предыдущему вопросу.

Функция работает, но мне было интересно, есть ли способ лучше.

import datetime

def quarter_values_builder():
    """A function that returns an array
    with all the actual year quarters
    """
    now = datetime.datetime.now()
    year = now.year
    year_str = str(year)
    quarter_values = ["31/03/","30/06/","30/09/","31/12/"] 
    quarter_values_now = [x+year_str for x in quarter_values]

    return quarter_values_now

current_quarters_string = quarter_values_builder()
print(current_quarters_string)  

2 ответа
2

В целом выглядит нормально. Я бы, наверное, написал немного по-другому, и я объясню различия.

import datetime

def get_current_quarters():
  """A function that returns an array
  with all the actual year quarters
  """
  current_year = datetime.date.today().year
  quarter_values = ["31/03/","30/06/","30/09/","31/12/"] 
  current_quarter_values = [
    "{0}{1}".format(x, current_year)
    for x in quarter_values]

  return current_quarter_values


current_quarters = get_current_quarters()
print(current_quarters)

Имя функции quarter_values_builder() для меня звучит слишком сложно. Действительно ли это строитель, если все, что он делает, — это берет известный список и добавляет к нему год? По сути, это прославленный форматтер строк. Строитель напоминает мне о Строитель шаблон, то, что здесь не применяется.

Получение текущего года тоже можно упростить. Нас не интересуют промежуточные переменные, поэтому создавать их не нужно. Он по-прежнему отлично читается, если мы сделаем все за один присест.

x+year_str должно быть хотя бы немного пробелов, x + year_str, чтобы повысить удобочитаемость. Пока мы это делаем, мы могли бы также использовать правильное форматирование строк. Вот как мы спасли нас str() В ролях и раньше. Форматирование позаботится об этом за нас. Поскольку строка стала немного длинной, я немного сократил ее для каждой функции. Это не обязательно для менее 79 символов, но я думаю, что это выглядит лучше.

В конце концов, нам не нужно называть переменную хранилища a string. Нам вообще не нужно его хранить, последние 2 строки могут легко превратиться в 1 строку. Но если мы сохраним его, указание типа переменной в имени скорее отвлечет, чем поможет. В конце концов, это Python. Тип может легко измениться в следующей версии. Если вы действительно хотите использовать подсказки типов в Python, используйте фактические подсказки типа.

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

Дополнение:
Нам не нужно использовать datetime.datetime.now() вообще. В datetime модуль имеет date, time а также datetime тип. Учитывая, что нас интересуют только year атрибут, a datetime это перебор. date достаточно, чтобы извлечь year из.

  • В основном разумно, хотя я бы заменил datetime.datetime.now с участием datetime.date.today что лучше отражает ваши намерения

    — Райндериен

  • @Reinderien Отличный улов, ты абсолютно прав.

    — мачта

Не видя остальной части вашего кода, трудно сказать, как это используется, но я думаю, что ваша функция объединяет логику и форматирование, и форматирование выполняется слишком рано. Если это возможно, вы должны сохранять информацию о реальной дате вплоть до краев программы. Следующее демонстрирует один из способов сохранить даты и перенести их на текущий год.

from datetime import date, timedelta
from typing import Iterable, Tuple

QUARTER_DATES = (
    date(2000, 3, 31),
    date(2000, 6, 30),
    date(2000, 9, 30),
    date(2000, 12, 31),
)


def get_current_quarters() -> Iterable[date]:
    year = date.today().year
    for quarter in QUARTER_DATES:
        yield quarter.replace(year=year)


print('n'.join(d.strftime('%d/%m/%Y') for d in get_current_quarters()))

дд-мм-ГГГГ также является неоднозначным и несортированным форматом. Ваше использование (которое вы не показали) должно быть либо «машиночитаемым» — например, для журналов, полезных данных REST и т. Д. — либо читаемым человеком, например, для пользовательского интерфейса. Если вам нужна машинная читаемость, настоятельно рекомендуется использовать формат ISO гггг-мм-дд. Если вам нужна удобочитаемость, а не жесткое кодирование dd / mm / YYYY, ваш код должен подчиняться текущему языку (не показан выше).

  • Не могли бы вы удалить следующую часть своего ответа? «[Date format in other peoples cultures] следует убить предрассудками и заменить [the date format in my culture]».

    — Пейлонрайз

  • @Peilonrayz ISO — это не культура. Более важное различие — это различие между машиночитаемостью и удобочитаемостью человеком, которое я расширил.

    — Райндериен

  • 2

    Да ISO и дд / мм / ггг не являются культурами. Однако культуры используют ISO и дд / мм / гггг. И ° C / ° F, дюймовые / метрические единицы и т. Д. Да. Основное внимание должно быть уделено удобочитаемости и удобочитаемости для человека, спасибо, что сместили акцент на это.

    — Пейлонрайз


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

Ваш адрес email не будет опубликован. Обязательные поля помечены *