Build a Salary Tracker - Step 39

Tell us what’s happening:

I inserted the following snippet which passes the test
if (hasattr(self, ‘_level’) and (new_salary < Employee._base_salaries[self._level])):
raise ValueError(f"Salary must be higher than minimum salary ${Employee._base_salaries[self._level]}.")

However I get an error: Your if statement should use hasattr(self, ‘_level’) to check if _level exists before comparing.

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:
            raise ValueError(f"Invalid value '{new_level}' for 'level' attribute.")
        if hasattr(self, '_level') and new_level == self.level:
            raise ValueError(f"'{self.level}' is already the selected level.")
        if hasattr(self, '_level') and Employee._base_salaries[new_level] < Employee._base_salaries[self.level]:
            raise ValueError("Cannot change to lower level.")
        print(f"'{self.name}' promoted to '{new_level}'.")
        self.salary = Employee._base_salaries[new_level]
        self._level = new_level

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

    @salary.setter
    def salary(self, new_salary):
        if not isinstance(new_salary, (int, float)):
            raise TypeError("'salary' must be a number.")
# User Editable Region

        if (hasattr(self, '_level') and (new_salary < Employee._base_salaries[self._level])):
            raise ValueError(f"Salary must be higher than minimum salary ${Employee._base_salaries[self._level]}.")
# User Editable Region
        
        self._salary = new_salary
        print(f'Salary updated to ${self.salary}.')

charlie_brown = Employee('Charlie Brown', 'trainee')
print(charlie_brown)
print(f'Base salary: ${charlie_brown.salary}')
charlie_brown.level = 'junior'

Your browser information:

User Agent is: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36

Challenge Information:

Build a Salary Tracker - Step 39

GitHub Link: https://github.com/freeCodeCamp/freeCodeCamp/blob/main/curriculum/challenges/english/blocks/workshop-salary-tracker/68cab02fd80a91042c0165b8.md

Hey @pushtinarula

Any reason why you are not accessing self.level directly?

Welcome to the forum @pushtinarula,

As the instruction attempts to explain, the only reason you are checking to see if self._level exists yet is to avoid an AttributeError during initialization (the only time it won’t exist). Once you know it exists, you can safely use the level getter, which is expected here.

Happy coding