Learn Special Methods by Building a Vector Space - Step 23

Tell us what’s happening:

I can’t seem to clear this step and have read all of the other posts on it, but not understanding exactly what it is that I’m supposed to do.

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

# User Editable Region

    print("loop begins")   
    def __str__(self):
        for i in vars(self):
            return getattr(self, (i for i in vars(self)))
            

# 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 = R3Vector(x=2, y=2, z=3)
print(v1.norm())
print(v2.norm())

Your browser information:

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

Challenge Information:

Learn Special Methods by Building a Vector Space - Step 23

This is pretty close, but you need to return a generator object, not use a loop like this.

You can see you have “for” twice which implies two loops, which is not necessary. Basically you need to make a list comprehension, which you’ve done on the second line.

Delete this line:

        for i in vars(self): 

The expression here should be getattr(self, i), that’s a complete expression by itself and you can’t break it up.

            return getattr(self, (i for i in vars(self)))

then put the comprehension in brackets to make it a generator:

return (comprehension)

I’ve tried both of these:

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

and

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

you should use getattr inside the comprehension

The second one is more correct:

return getattr(self, i) (i for i in vars(self))

This can’t be by itself: getattr(self, i) there is no i here, this is the expression it needs to be where the i is in here:

(i for i in vars(self))

Your expression here is just i you need to use getattr instead.

Everything should be within brackets, except return, to make it a generator

return ( expression comprehension etc)

I’ve tried a few different things, I think that this one may be the closest so far:

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

the for _ in _ must be there otherwise it’s not a comprehension

Thank you guys very much!

1 Like