Jimmy
Jimmy

Reputation: 3

How to delete an item from a class in python based on user input?

I am trying to allow a member to leave the Team if they so wish. By doing this, the system will delete them and their user ID will become available to the next person who wishes to join the team. I am receiving an error with my code. Can someone please advise what I am doing wrong and how this can be achieved?

I would like my add members and remove members to update all the time, based on user input and the needs of the members. I hope this makes sense!

For example: If 'Carl' decided to leave, he would be removed and the next member to join would be assigned the membership ID '2'

Below is my code:

all_users = []


class Team(object):
    members = []  
    user_id = 0

    def __init__(self, first, last, address):
        self.user_id = Team.user_id
        self.first = first
        self.last = last
        self.address = address
        self.email = first + '.' + last + '@python.com'
        Team.user_id += 1

        Team.members.append(self)

    def __str__(self):
        print()
        return 'Membership ID: {}\nFirst Name: {}\nSurname: {}\nLocation: {}\nEmail: {}\n'.format(self.user_id,
                                                                                          self.first, self.last,
                                                                                          self.address,
                                                                                          self.email)
        print()

    @staticmethod
    def all_members():
        for user in all_users:
            print(user)

    @staticmethod
    def add_member():
        print()
        print("Welcome to the team!")
        print()
        first_name = input("What's your first name?\n")
        second_name = input("What's your surname?\n")
        address = input("Where do you live?\n")

        all_users.append(Team(first_name, second_name, address))

    @staticmethod
    def remove_member():
        print()
        print("We're sorry to see you go , please fill out the following information to continue")
        print()
        first_name = input("What's your first name?\n")
        second_name = input("What's your surname?\n")
        address = input("Where do you live?\n")
        unique_id = input("Finally, what is your User ID?\n")

        if unique_id in all_users:
            del unique_id

        all_users(User(first_name, second_name, address))


    def main():
        user_1 = Team('Chris', 'Parker', 'London')
        user_2 = Team('Carl', 'Lane', 'Chelsea')

    all_users.extend([user_1, user_2])

    continue_program = True
    while continue_program:
        print("1. View all members")
        print("2. Want to join the team?")
        print("3. Need to leave the team?")
        print("3. Quit")
        try:
            choice = int(input("Please pick one of the above options "))

            if choice == 1:
                Team.all_members()
            elif choice == 2:
                Team.add_member()
            elif choice == 3:
                Team.remove_member()
            elif choice == 4:
                continue_program = False
                print()
                print("Come back soon! ")
                print()
            else:
                print("Invalid choice, please enter a number between 1-3")
                main()
         except ValueError:
             print()
             print("Please try again, enter a number between 1 - 3")
             print()


if __name__ == "__main__":
main()

Upvotes: 0

Views: 675

Answers (2)

Shemetz
Shemetz

Reputation: 109

The remove_member method is wrong for several reasons. The line del unique_id will not remove the value from all_users, which is just a list of Team Members. And you shouldn't have to ask the user for all of this information - just the ID (or the name) would be enough.

What I suggest is:

@staticmethod
def remove_member():
    print()
    print("We're sorry to see you go , please fill out the following information to continue")
    print()
    unique_id = input("what is your User ID?\n")
    unique_id = int(unique_id)
    for i, user in enumerate(all_users):
        if user.user_id == unique_id:
            all_users.remove(i)
            break

Upvotes: 1

pj.dewitte
pj.dewitte

Reputation: 456

If it is important that the user ids are reused, you can keep a list of user ids that are available again. When creating a new member, you can first check that list, and use an old id if there is one.

You can also choose not to reuse the user ids of removed users. An id doesn't really have a meaning and not reusing it makes it simpeler for you.

Finally, you might want to restructure your code:

Team(first_name, second_name, address)

This doesn't make sense: a team with a first name, last name and adress! Better would be to have two classes:

team = Team()
user = User(first_name, second_name, address)
team.add_member(user)
team.remove_member(user)

Some other tips:

# This won't work, because all_users contains Team instances, not numbers. So the user will never be found.
if unique_id in all_users:
    # This won't do anything: `del` only removes the access to the variable (might free up memory in heavy applications). It doesn't remove the user from all_users
    del unique_id

Upvotes: 0

Related Questions