Build a Salary Tracker - Step 31

Tell us what’s happening:

I have failed step 31 even though I have done everything that has been said

Your code so far

class Employee:
    _base_salaries = {
        'trainee': 1000,
        'junior': 2000,
        'mid-level': 3000,
        'senior': 4000,
    }

    def __init__(self, name, level):
        self.name = name
        self.level = level
        self._salary = Employee._base_salaries[level]

    def __str__(self):
        return f'{self.name}: {self.level}'

    def __repr__(self):
        return f"Employee('{self.name}', '{self.level}')"

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, new_name):
        if not isinstance(new_name, str):
            raise TypeError("'name' must be a string.")
        self._name = new_name
        print(f"'name' updated to '{self.name}'.")

    @property
    def level(self):
        return self._level

    @level.setter
    def level(self, new_level):
        if not isinstance(new_level, str):
            raise TypeError("'level' must be a string.")
        if new_level not in Employee._base_salaries:

# User Editable Region

            raise ValueError(f"Invalid value '{new_level}' for 'level' attribute.")
        if hasattr(self, '_level') and self._level == new_level:
            raise ValueError(f"'{self._level}' is already the selected level.")
        self._level = new_level

# User Editable Region

        

    @property
    def salary(self):
        return self._salary

charlie_brown = Employee('charlie', 'trainee')

print(f'Base salary: ${charlie_brown.salary}')

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36

Challenge Information:

Build a Salary Tracker - Step 31

GitHub Link: freeCodeCamp/curriculum/challenges/english/blocks/workshop-salary-tracker/68c9cab4b1118da59eecfc56.md at main · freeCodeCamp/freeCodeCamp · GitHub

Welcome to the forum @Bladder

Here is a post you may find helpful.

Happy coding

Welcome to the forum @Bladder,

There seems to be a lot of confusion around this.

When an Employee object is first initialized, the level setter is used to set the level:

But since the internal protected attribute, _level, is created within the level setter, we need to check if it exists (it won’t exist when the Employee object is first initialized), and if it does, we know level has already been set and we can use the level getter for the rest of the code in this if statement.

Also, here the tests are expecting the attributes in this condition to be swapped.

Happy coding