Passing a function's output as a parameter of another function

Question:

I’m having a hard time figuring out how to pass a function’s return as a parameter to another function. I’ve searched a lot of threads that are deviations of this problem but I can’t think of a solution from them. My code isn’t good yet, but I just need help on the line where the error is occurring to start with.

Instructions:

  • create a function that asks the user to enter their birthday and returns a date object. Validate user input as well. This function must NOT take any parameters.
  • create another function that takes the date object as a parameter. Calculate the age of the user using their birth year and the current year.
def func1():
    bd = input("When is your birthday? ")
    try:
        dt.datetime.strptime(bd, "%m/%d/%Y")
    except ValueError as e:
        print("There is a ValueError. Please format as MM/DD/YYY")
    except Exception as e:
        print(e)
    return bd

def func2(bd):
    today = dt.datetime.today()
    age = today.year - bd.year
    return age

This is the Error I get:

TypeError: func2() missing 1 required positional argument: 'bday'

So far, I’ve tried:

  • assigning the func1 to a variable and passing the variable as func2 parameter
  • calling func1 inside func2
  • defining func1 inside func2
Asked By: giovanni

||

Answers:

I think what you want to do is use it as an argument. You can do it like this:

import datetime as dt

def func1():
    bd = input("When is your birthday? ")
    try:
        date_object = dt.datetime.strptime(bd, "%m/%d/%Y")
    except ValueError as e:
        print("There is a ValueError. Please format as MM/DD/YYY")
    except Exception as e:
        print(e)
    return date_object

def func2(bd)
    today = dt.datetime.today()
    age = today.year - bd.year
    return age

func2(func1())
Answered By: Prado910

You’re almost there, a few subtleties to consider:

  1. The datetime object must be assigned to a variable and returned.
  2. Your code was not assigning the datetime object, but returning a str object for input into func2. Which would have thrown an attribute error as a str has no year attribute.
  3. Simply subtracting the years will not always give the age. What if the individual’s date of birth has not yet come? In this case, 1 must be subtracted. (Notice the code update below).

For example:

from datetime import datetime as dt

def func1():
    bday = input("When is your birthday? Enter as MM/DD/YYYY: ")
    try:
        # Assign the datetime object.
        dte = dt.strptime(bday, "%m/%d/%Y")
    except ValueError as e:
        print("There is a ValueError. Please format as MM/DD/YYYY")
    except Exception as e:
        print(e)
    return dte  # <-- Return the datetime, not a string.

def func2(bdate):
    today = dt.today()
    # Account for the date of birth not yet arriving.
    age = today.year - bdate.year - ((today.month, today.day) < (bdate.month, bdate.day))
    return age

Can be called using:

func2(bdate=func1())
Answered By: S3DEV
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.