Я создаю эту простую функцию, пытаюсь использовать стиль 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 ответа
В целом выглядит нормально. Я бы, наверное, написал немного по-другому, и я объясню различия.
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
из.
Не видя остальной части вашего кода, трудно сказать, как это используется, но я думаю, что ваша функция объединяет логику и форматирование, и форматирование выполняется слишком рано. Если это возможно, вы должны сохранять информацию о реальной дате вплоть до краев программы. Следующее демонстрирует один из способов сохранить даты и перенести их на текущий год.
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, дюймовые / метрические единицы и т. Д. Да. Основное внимание должно быть уделено удобочитаемости и удобочитаемости для человека, спасибо, что сместили акцент на это.
— Пейлонрайз
В основном разумно, хотя я бы заменил
datetime.datetime.now
с участиемdatetime.date.today
что лучше отражает ваши намерения— Райндериен
@Reinderien Отличный улов, ты абсолютно прав.
— мачта