Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Python

How can I test out my code in workspaces?

I've been trying to test this out in the interactive shell from workspaces, but I keep getting errors when trying to import these classes. It's not passing the challenge, but I think I can figure it out once I know how to test it.

What command do I use?

>>> from morse.py import S                                                     
Traceback (most recent call last):                                             
  File "<stdin>", line 1, in <module>                                          
ModuleNotFoundError: No module named 'morse.py'; 'morse' is not a package 

Thanks!

morse.py
class Letter:
    def __init__(self, pattern=None):
        self.pattern = pattern


class S(Letter):
    def __init__(self):
        pattern = ['.', '.', '.']
        seperator = '-'
        super().__init__(pattern)
        def __str__(self, pattern):           
           for i in pattern:
              if i = '.':
                 pattern[i] = 'dot'
              elif i = '_':
                 pattern[i] = 'dash'
              print(seperator.join(pattern))

3 Answers

You see this error message

TypeError: __str__ returned non-string (type NoneType) 

because your __str__ method doesn't return anything so print(test) is attempting to print None which is the return value when there is no return statement.

I would have thought you'd have another error first since there should be a colon at the end of this line

def __str__(self)

Some additional comments:

  • You are iterating through self.pattern but then update self.pattern inside the loop with the assignments. It would be better to create a separate list variable before the loop and then append to this list based on your if conditions

  • You have the join syntax reversed. It should be separator.join(list) instead of list.join(separator)

That worked! I made some changes based on your comments and managed to pass the challenge. Still the original question remains for me. How can I run this through the shell to get the output I'm returning?

class Letter: 
    def __init__(self, pattern=None):
        self.pattern=pattern
    def __str__(self):
        seperator = '-'
        newlist = []
        for i in self.pattern:
            if i == '.':
                newlist.append('dot')
            elif i == '_':
                newlist.append('dash')
            pattern = newlist
        return str(seperator.join(newlist))

class S(Letter):
    def __init__(self):     
        pattern = ['.', '.', '.']
        super().__init__(pattern)

pattern is a parameter for __init__ so it doesn't need to be passed in again to __str__. The only parameter needed there is self. Inside the __str__ method you can use it as self.pattern.

Hey Kris. I'm getting back to this after a while, but I still seem to be coming across errors in the shell. Maybe I didn't understand your last comment. Hopefully it's something small that I'm just overlooking. Thanks in advance for your help!

In the shell:

>>> from morse import Letter                                                                                 
>>> test = Letter(['.', '.', '.'])                                                                           
>>> print(test)                                                                                              
-                                                                                                            
Traceback (most recent call last):                                                                           
  File "<stdin>", line 1, in <module>                                                                        
TypeError: __str__ returned non-string (type NoneType)                                                       
>>>                                                                                                          

And my code:

class Letter: 
    def __init__(self, pattern=None, seperator='-'):
        self.pattern=pattern
        self.seperator=seperator
    def __str__(self)
        for i in self.pattern:
            if i == '.':
                self.pattern = 'dot'
            elif i == '_':
                self.pattern = 'dash'
        print(self.pattern.join(self.seperator))

class S(Letter):
    def __init__(self):
        self.seperator = '-'        
        self.pattern = ['.', '.', '.']

        super().__init__(pattern)

For the challenge you are to modify class Letter not class S.

I want you to add a __str__ method to the Letter class

Then to test import without the .py extension, create an instance of the class and print.

>>> from morse import Letter                                                         
>>> test = Letter(['.', '.', '.'])                                                   
>>> print(test)

The result should be

dot-dot-dot

Thanks Kris! At first I was getting tab errors with those commands, so I typed it out by hand and that cleared it up. However, now I'm getting a TypeError.

My code

class Letter: 
    def __init__(self, pattern=None):
        self.pattern=pattern
    def __str__(self, pattern):
        for i in pattern:
            if i == '.':
                pattern[i] = 'dot'
            elif i == '_':
                pattern[i] = 'dash'
        print(seperator.join(pattern))

class S(Letter):
    def __init__(self):
        seperator = '-'
        pattern = ['.', '.', '.']
        super().__init__(pattern)

In the shell.

>>> from morse import Letter                                                              
>>> test = Letter(['.', '.', '.'])                                                        
>>> print(test)                                                                           
Traceback (most recent call last):                                                        
  File "<stdin>", line 1, in <module>                                                     
TypeError: __str__() missing 1 required positional argument: 'pattern'                    

What is my method missing there?