开发者

for loop iterates into a NoneType only during a __str__ statement?

开发者 https://www.devze.com 2023-04-07 18:19 出处:网络
So I\'m working in Python trying to create a ShapeSet instance that contains a list of Shape instances and I need it to print out the list of Shape instances.

So I'm working in Python trying to create a ShapeSet instance that contains a list of Shape instances and I need it to print out the list of Shape instances.

I can use the for loop in other parts of the code without running into an error. However, when I attempt a print statement it prints out the whole list and at the end results in error: __str__ returned non-string (type NoneType)

I don't understand why it fails to understand to stop at the end of the list here. (At least that's what I think it's doing).

Any help is greatly appreciated.

class ShapeSet:
    def __init__(self):
        """
        Initialize any needed variables
        """
        self.collect = []
        self.place = None

    def __iter__(self):
        """
        Return an iterator that allows you to iterate over the set of
        shapes, one shape at a time
        """
        self.place = 0
        return self

    def next(self):
        if self.place >= len(self.collect):
            raise StopIteration
        self.place = self.place + 1
        return self.collect[self.place-1]

    def addShape(self, sh):
        """
        Add shape 开发者_如何学Gosh to the set; no two shapes in the set may be
        identical
        sh: shape to be added
        """
        s_count = 0
        c_count = 0
        t_count = 0
        self.collect.append(sh)
        for i in self.collect:
            if type(sh) == Square and type(i) == Square:
                if sh.side == i.side:
                    s_count = s_count + 1
                if s_count == 2:
                    self.collect.remove(sh)
                    print('already there')
            if type(sh) == Circle and type(i) == Circle:
                if sh.radius == i.radius:
                    c_count = c_count + 1
                if c_count == 2:
                    self.collect.remove(sh)
                    print('already there')
            if type(sh) == Triangle and type(i) == Triangle:
                if sh.base == i.base and sh.height == i.height:
                    t_count = t_count + 1
                if t_count == 2:
                    self.collect.remove(sh)
                    print('already there')

    def __str__(self):
        """
        Return the string representation for a set, which consists of
        the string representation of each shape, categorized by type
        (circles, then squares, then triangles)
        """
        for i in self.collect:
            if type(i) == Square:
                print ('Square with measurements ' +  str(i.side))
            if type(i) == Circle:
                print ('Circle with measurements ' + str(i.radius))
            if type(i) == Triangle:
                print ('Triangle with measurements, base/height ' + str(i.base)+ ' ' + str(i.height))


Read the docstring in your __str__ function. You're suppose to "return the string representation" not print it. Since there is no return statement in the __str__ function, it returns None, which print chokes on.

Instead, actually return the desired string, and let the external print call display it:

def __str__(self):
    """
    Return the string representation for a set, which consists of
    the string representation of each shape, categorized by type
    (circles, then squares, then triangles)
    """
    strings = []
    for i in self.collect:
        if type(i) == Square:
             strings.append('Square with measurements ' +  str(i.side))
        if type(i) == Circle:
            strings.append('Circle with measurements ' + str(i.radius))
        if type(i) == Triangle:
            strings.append('Triangle with measurements, base/height ' + str(i.base)+ ' ' + str(i.height))
    return '\n'.join(strings)


You wrote

def __str__(self):
    """
    **Return** the string representation for a set, which consists of
    the string representation of each shape, categorized by type
    (circles, then squares, then triangles)
    """

but you don't return anything - you just print stuff.

Put a appropriate __str__ method on all your classes:

class Square:

    def __str__(self):
        return 'Square with measurements ' +  str(i.side)

class Circle:

    def __str__(self):
        return 'Circle with measurements ' + str(i.radius)

# and so on

and a representation for your ShapeSet:

class ShapeSet:

    def __str__(self):
        return '\n'.join(str(x) for x in self.collect)

Now you can print(some_shapeset) as well as print(some_circle).


You could also do whatever you like within the str method, itterate, print outputs, more logic, etc, as long as at the end, you return a string i.e. return "" just to satisfy the requirement.

In Your case:

def __str__(self):
    """
    Return the string representation for a set, which consists of
    the string representation of each shape, categorized by type
    (circles, then squares, then triangles)
    """
    for i in self.collect:
        if type(i) == Square:
            print ('Square with measurements ' +  str(i.side))
        if type(i) == Circle:
            print ('Circle with measurements ' + str(i.radius))
        if type(i) == Triangle:
            print ('Triangle with measurements, base/height ' + str(i.base)+ ' ' + str(i.height))
    return ""
0

精彩评论

暂无评论...
验证码 换一张
取 消