Skip to content
Advertisement

How can I define name ‘unit’ in def to?

I am trying to create a temperature conversion module. My class is set up as below:

class Temperature:
    """A class to help work with temperature in various units"""
    
    def __init__(self, number, unit):
        # Convert and store units as self.celcius measure
        self.number = number
        self.unit = unit
    
    def __str__(self):
        return f"Temperature: {self.number}{self.unit}"           
    
    def celcius(self): #convert to celcius
        if unit == 'C': self.celcius = number 
        elif unit == 'F': self.celcius = (number - 32) * 5/9 
        elif unit == 'K': self.celcius = number - 273.15 
        else: raise Exception("Unit not recognised")# Unit not recognised
    
    def to(self, unit, dp=None):#convert self.celcius to temperature measure
        if unit == 'C': number = self.celcius()
        elif unit == 'F': number = (9/5 * self.celcius()) + 32
        elif unit == 'K': number = self.celcius() + 273.15
        else: raise Exception("Unit not recognised")
        if dp: number= round(number, dp)
        return f"{number}{unit}"

I then try to convert using the following:

    from temperature import Temperature
#assign temps
temp_1 = Temperature(32,'C')
temp_2 = Temperature(100, 'F')
temp_3 = Temperature(324, 'K')

print(temp_1) 
print(temp_2) 
print(temp_3) 

print(temp_1.to('F')) 
print(temp_2.to('K', 3)) 
print(temp_3.to('C', 1)) 

The original prints work but the conversion has the error: NameError: name ‘unit’ is not defined. How can I avoid this?

Advertisement

Answer

class Temperature:
    """A class to help work with temperature in various units"""

    def __init__(self, number, unit):
        # Convert and store units as self.celcius measure
        self.number = number
        self.unit = unit

    def __str__(self):
        return f"Temperature: {self.number}{self.unit}"

    def celcius(self):  # convert to celcius
        if self.unit == 'C':
            return self.number
        elif self.unit == 'F':
            return (self.number - 32) * 5 / 9
        elif self.unit == 'K':
            return self.number - 273.15
        else:
            raise Exception("Unit not recognised")  # Unit not recognised

    def to(self, unit, dp=None):  # convert self.celcius to temperature measure
        if unit == 'C':
            self.number = self.celcius()
        elif unit == 'F':
            self.number = (9 / 5 * self.celcius()) + 32
        elif unit == 'K':
            self.number = self.celcius() + 273.15
        else:
            raise Exception("Unit not recognised")
        if dp: number = round(self.number, dp)
        return f"{self.number}{unit}"

if __name__ == '__main__':
    # assign temps
    temp_1 = Temperature(32, 'C')
    temp_2 = Temperature(100, 'F')
    temp_3 = Temperature(324, 'K')

    print(temp_1)
    print(temp_2)
    print(temp_3)

    print(temp_1.to('F'))
    print(temp_2.to('K', 3))
    print(temp_3.to('C', 1))
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement