Как добавить определенные «элементы управления» к функции? (редактировать: добавлена полная функция)

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть следующая функция:

 function(['28-02-2016','31-02-2016'])
['february', '*']
  

РЕДАКТИРОВАТЬ (полная функция)

 import calendar
def function(monthList):
    months = {"01": "january", "02":"february", "03":"march", "04":"april", "05":"may", "06":"june", "07":"july", "08":"august", "09":"september", "10":"october", "11":"november", "12":"december"}
    returnList = []
    for monthStr in monthList:
            month = str(monthStr)[3:5]
    if month in months.keys():
        if int(monthStr[:2]) <= calendar.monthrange(int(monthStr[-4:]), int(monthStr[3:5]))[1]:
            returnList.append(months[month])
        else:
            returnList.append("*")
    else:
        returnList.append("*")
return returnList
  

Если дата правильная, функция создает список, в котором указан месяц, в противном случае ставится '*' . Но если я напишу:

 function([02-02-20a1]:
  

Я получаю эту ошибку:

      6         month = str(monthStr)[3:5]
     7         if month in months.keys():
---> 8             if int(monthStr[:2]) <= calendar.monthrange(int(monthStr[-4:]), int(monthStr[3:5]))[1]:
     9                 returnList.append(months[month])
    10             else:

ValueError: invalid literal for int() with base 10: '20a1'
  

Итак, Python говорит мне, что я должен поместить элемент управления в список под номером 8. Как мне сообщить функции действовать подобным образом?

 function(['02-02-19a1'])
[*]
  

Комментарии:

1. Это говорит вам, что '20a1' не является допустимым целочисленным литералом. Если вы получаете ValueError , вы можете предположить, что это недопустимая дата, поэтому смотрите docs.python.org/3/tutorial/errors.html для обработки ошибок. Кроме того, вы можете значительно упростить с помощью datetime встроенного синтаксического анализа, который будет корректно работать, например, с високосными годами.

2. Python сообщает, что у вас ошибка в вашем коде / вводе

3. Я понятия не имею, что вы подразумеваете под «элементами управления». Очевидно, что «20a1» и «19a1» не являются допустимыми значениями для передачи int .

4. «Python говорит мне, что я должен поместить элемент управления в список под номером 8» — Нет. Откуда вы взяли эту идею? Это просто говорит вам, что '20a1' не является целым числом. Вы должны перехватить это исключение и вернуть '*' . Я действительно не могу дать вам более конкретный ответ, потому что вы не показали всю функцию целиком.

5. @DanielRoseman int(*, base= 10) вы хотели сказать

Ответ №1:

Используйте Python time.strptime и time.strftime :

 import time

def get_month(date_string):
    try:
        t = time.strptime(date_string,'%d-%m-%Y')
        return time.strftime('%B', t).lower()
    except ValueError:
        return '*'
  

Если дата недопустима, ValueError будет поднята, и в этом случае вы вернетесь '*' .

Вызывайте get_month для каждой строки даты в вашей функции.

 def get_months(date_strings):
    return [get_month(date_string) for date_string in date_strings]
  

Комментарии:

1. Это не охватывало бы, например function(['bla-7-99', 'iiiiiiiiiii'])

2. Отредактировано для использования strftime и strptime вместо.

3. итак, мне просто нужно добавить этот маленький абзац к тестированию моей функции?

4. @xli что, если бы я хотел добавить список потенциальных дат в качестве входных данных?

5. Вы можете добавить эту функцию в свой модуль. В вашей другой функции вызывайте get_month для каждой потенциальной даты в списке и добавляйте каждый результат в список, который вы затем возвращаете. Более кратко, return [get_month(monthStr) for monthStr in monthList]