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

TypeError: ' in <string> ' requires string as left operant, not None Type

https://teamtreehouse.com/library/python-basics/letter-game-app/letter-game-refinement

Hi, I'm having this error when I do not type a letter. In the last excersise it worked as the return was "That is not a word". Now it returns that plus the error:

Traceback (most recent call last): File "letter_game.py", line 114, in <module> play(done) File"letter_game.py", line 76 in play if guess in secret_word: TypeError: ' in <string> ' requires string as left operant, not None Type

I have the same code as the video so I don't know why I'm getting the Error.

import os
import random
import sys

words=[
'manzana',
'banano',
'pera',
'piña',
'papaya',
'sandia',
'cereza',
'granadilla',
'melon',
'coco',
'fresa',
'uva',
'mora',
'arandano',
'limon',
'naranja',
'mandarina',
'franbuesa'
]

def clear():
    if os.name == "nt":
        os.system("clear")
    else:
        os.system('clear')

def draw(bad_guesses, good_guesses, secret_word):
    clear()

    print('strikes: {}/7'.format(len(bad_guesses)))
    print('')

    for letter in bad_guesses:
        print(letter, end=" ")
    print('\n\n')

    for letter in secret_word:
        if letter in good_guesses:
            print(letter, end="")
        else:
            print('_', end="")

    print('')


def get_guess(bad_guesses, good_guesses):
    guess =input("Adivina una letra: ").lower()

    if len(guess) !=1:
        print("Solo puedes adivinar una letra")

    elif guess in bad_guesses or guess in good_guesses:
        print("ya haz probado con esa letra")

    elif not guess.isalpha():
        print("Solo puedes adivinar letras")

    else:
        return guess

def play(done):
    clear()
    secret_word = random.choice(words)
    bad_guesses = []
    good_guesses = []

    while True:
        draw(bad_guesses, good_guesses, secret_word)
        guess= get_guess(bad_guesses, good_guesses)

        if guess in secret_word:
            good_guesses.append(guess)
            found = True
            for letter in secret_word:
                if letter not in good_guesses:
                    found = False
            if found:
                print("GANASTE!")
                print("La palabra secreta era {}".format(secret_word))
                done = True
        else:
            bad_guesses.append(guess)
            if len(bad_guesses) == 7:
                draw(bad_guesses, good_guesses, secret_word)
                print("PERDISTE!")
                print("La palabra secreta era {}".format(secret_word))
                done = True

        if done:
            play_again = input("Quieres jugar de nuevo? y/n ").lower()
            if play_again != 'n':
                return play(done=False)
            else:
                sys.exit()

def welcome():
    start = input("Oprime enter para empezar o Q para salir  ").lower()
    if start == "q":
        print("Chao!")
        sys.exit()

print("Bienvenido a ahorcado!")

done= False

while True:
    clear()
    welcome()
    play(done)

Thanks!

1 Answer

Chris Freeman
MOD
Chris Freeman
Treehouse Moderator 68,468 Points

The error is raised because get_guess returns None if input value is not a valid guess. There are two paths from here:

  • improve get_guess() to only return a valid guess and loop back to input() until valid guess is entered.
  • inside play(), add loop around the call to get_guess() to check of guess is valid before continuing.

Good Luck! Post back if you have more questions.