Ошибка при использовании переменной в Python calendar.monthrange

Я пытаюсь напечатать количество дней в месяце, используя Python calendar.monthrange функция.

У меня есть скрипт, который запускается через cron 1-го числа каждого месяца, и мне нужно возвращать количество дней с предыдущего месяца. Я также использую модуль стрелок, чтобы лучше обрабатывать и форматировать любые вызовы даты / времени, которые я использую в своих сценариях.

Поскольку мне нужно найти количество дней в предыдущем месяце, которое составляет всего один день с даты запуска сценария, я просто вычитаю 1 один с помощью timedelta.

Вот очень сокращенная версия моего кода, но это рабочая часть:

import calendar
import arrow
import time
from datetime import date, timedelta

yesterday = date.today() - timedelta(1)

cYfDate = yesterday.strftime('%Y.%m.%d')
cYfDateY = arrow.get(cYfDate).format('YYYY')
cYfDateM = arrow.get(cYfDate).format('M')

print cYfDateY
print cYfDateM

print calendar.monthrange(cYfDateY + ',' + cYfDateM)[1]

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

Traceback (most recent call last):
  File "/home/pi/SystemChecker.py", line 15, in <module>
    print calendar.monthrange(cYfDateY + ',' + cYfDateM)
TypeError: monthrange() takes exactly 2 arguments (1 given)

Я не могу понять, почему это говорит мне, что есть только один аргумент, когда там явно два аргумента.

3 ответа

Решение

Непосредственная проблема заключается в том, что monthrange ожидает двух аргументов; но вы по какой-то причине берете два аргумента и объединяете их в одну строку. Не делай этого; просто передайте аргументы:

calendar.monthrange(cYfDateY, cYfDateM)

Однако остальная часть сценария тоже странная. Вы правильно рассчитываете вчерашнюю дату, но затем конвертируете ее в строку, а затем используете стороннюю arrow библиотека, чтобы получить месяц и день из этой строки. Это даже не сработает, так как теперь это строки. Почему вы это делаете? Почему бы просто не узнать месяц и дату, которые у вас уже были?

yesterday = date.today() - timedelta(1)   
cYfDateY = yesterday.year
cYfDateM = yesterday.month

+ Изменить print calendar.monthrange(cYfDateY + ',' + cYfDateM)[1]
Чтобы напечатать calendar.monthrange(cYfDateY, cYfDateM)[1]

calendar.monthrange() принимает 2 аргумента, year а также month, Проверьте документацию здесь для более подробной информации:

calendar.monthrange (год, месяц)

Другие вопросы по тегам