Ну, вопрос кажется довольно простым.
Вам нужно проверить количество «полных» лет, и только если оно равно 18, вам нужно беспокоиться о месяцах и днях. Крайний регистр: endDate.year - startDate.year == 18
, и он делится на два случая: startDate.month != endDate.month
и startDate.month == endDate.month
, когда вам просто нужно проверить дни:
def isOfAge(birthDate, age=18):
endDate = date.today()
years = endDate.year - birthDate.year
if years == age:
return (birthDate.month < endDate.month or
(birthDate.month == endDate.month and birthDate.day < endDate.day))
return years > age
Это все еще больше, чем однострочная лямбда, но она все еще довольно коротка и кажется быстрой в исполнении.