Learn Special Methods by Building a Vector Space - Step 60

Tell us what’s happening:

For the __ eq __ method: I am trying to compare each attribute of the current instance to the same attribute of other, and not sure what part of my code is incorrect.
To be more specific - in this step I have added the elif and else conditions to the __ eq __ method

I get the error:
" The __eq__ method should return True if each attribute of the current instance is equal to the same attribute of other and False otherwise."

Your code so far

class R2Vector:
    def __init__(self, *, x, y):
        self.x = x
        self.y = y

    def norm(self):
        return sum(val**2 for val in vars(self).values())**0.5

    def __str__(self):
        return str(tuple(getattr(self, i) for i in vars(self)))

    def __repr__(self):
        arg_list = [f'{key}={val}' for key, val in vars(self).items()]
        args = ', '.join(arg_list)
        return f'{self.__class__.__name__}({args})'

    def __add__(self, other):
        if type(self) != type(other):
            return NotImplemented
        kwargs = {i: getattr(self, i) + getattr(other, i) for i in vars(self)}
        return self.__class__(**kwargs)

    def __sub__(self, other):
        if type(self) != type(other):
            return NotImplemented
        kwargs = {i: getattr(self, i) - getattr(other, i) for i in vars(self)}
        return self.__class__(**kwargs)

    def __mul__(self, other):
        if type(other) in (int, float):
            kwargs = {i: getattr(self, i) * other for i in vars(self)}
            return self.__class__(**kwargs)        
        elif type(self) == type(other):
            args = [getattr(self, i) * getattr(other, i) for i in vars(self)]
            return sum(args)            
        return NotImplemented

# User Editable Region

    def __eq__(self, other):
        if type(self) != type(other):
            return NotImplemented
        elif {type(getattr(self, i)) == type(getattr(other, i)) for i in vars(self)}:
            return True
        else: 
            return False

# User Editable Region

class R3Vector(R2Vector):
    def __init__(self, *, x, y, z):
        super().__init__(x=x, y=y)
        self.z = z

v1 = R2Vector(x=2, y=3)
v2 = R2Vector(x=0.5, y=1.25)
print(f'v1 = {v1}')
print(f'v2 = {v2}')
v3 = v1 + v2
print(f'v1 + v2 = {v3}')
v4 = v1 - v2
print(f'v1 - v2 = {v4}')
v5 = v1 * v2
print(f'v1 * v2 = {v5}')

Your browser information:

User Agent is: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36

Challenge Information:

Learn Special Methods by Building a Vector Space - Step 60

they need to be equal not just in type but as the value too. By definition the attributes of a vector are int or float so you don’t have to worry about them being other types

if you want to use a comprehension, can I suggest a generator instead? you are using a dictionary comprehension, and that requires a key. and something like any, all, some

1 Like

Thank you. In that case I think I am confused about how to compare the values of self and other.
I tried:

elif self == other:
    return True

as well as

elif type(self) == type(other):
         for i in vars(self):
             if getattr(self) == getattr(other):
                 continue
             else:
                 break
         return True

and neither passed. I believed the first one would work because (I thought) it compares the whole vector type and values, but no luck.
I am still relatively new to programming so I bet there is a concept I am missing here but I don’t know what it is.

Please, go back to this version of the code, it’s closer to want you want to achieve.

Now, let’s try to analyze what you wrote here:
{type(getattr(self, i)) == type(getattr(other, i)) for i in vars(self)}
The way it is written, this is a set comprehension containing boolean values. First thing to note: a set comprehension could work but it’s a bit weird here. Use () for a generator expression or [] for a list comprehension instead.

The expression type(getattr(self, i)) == type(getattr(other, i)) checks if the type of the attribute i of self is equal to the type of the same i attribute of other. You want to check if those attributes are equal, not if their types are equal.

Once you modify the expression to compare each attribute of self with the same attribute of other, the comprehension will contain a bunch of Trues and/or Falses. If you use that as a condition for the elif, the condition will always be True because the comprehension is not empty. The condition should check that all the values stored inside the comprehension are True.

Hope this helps.

3 Likes

Very helpful, thank you!!!
And as a bonus I learned the all() function :smiley:

1 Like

Heyy thank you, i might never thank about the all function, i have just added it to my code and then it works.