How do I use an input to print a class definition?

Question:

I am trying to code something basic in python just for fun and I encountered an issue,

# Employee is a class with the initialization being self, name, status

e1 = Employee("Tom, Lincoln", "Present")
e2 = Employee("Sam, Bradley", "Absent")
print(e1.status)

# printing e1 status will make "Present" or "Absent"

while True:
    try:
        cmd = input("Cmd: ")

        if cmd == "status_check":
            who = input("Who: ")
            # putting in e1 or e2 will get their respective statuses

I’ve tried everything I can think off like, making it so that it gets a number out of the input("Who: ") input so I can better use eval or exac, but doing that makes it so I cant run e1.status because all it has is a 1 and I can’t make a "e" appear in front of it so I can’t run e1.status. I’ve also tried using just eval or exac but that didn’t get the wanted result because I would have to type my code in the input("Cmd: "). That’s isn’t the only things I’ve tried but those are some that come to mind.

I’m just stumped here.

Asked By: Ppeng

||

Answers:

If you want to map names to values, you don’t want separate variables. You want a dictionary.

Rather than

e1 = Employee("Tom, Lincoln", "Present")
e2 = Employee("Sam, Bradley", "Absent")

Consider

employees = {
    'e1': Employee("Tom, Lincoln", "Present"),
    'e2': Employee("Sam, Bradley", "Absent"),
}

To access an employee, write

print(employees["e1"].status)

and then you can use the input string to subscript employees as well.

who = input("Who: ")
print(employees[who].status)
Answered By: Silvio Mayolo

one other approach is to use sys module:

import sys

# class definitions etc


while True:
    try:
        cmd = input("Cmd: ")

        if cmd == "status_check":
            who = input("Who: ")
            atr = getattr(sys.modules[__name__], who)
            print(atr.status)

Answered By: drx
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.