0

I know there are many posts regarding this exercise from this heavily criticized book, but so far it helped me to start understanding things.

However, with every chapter there are questions, and while some I can answer myself, others are far more complicated.

import random
from urllib import urlopen
import sys

WORD_URL = "http://learncodethehardway.org/words.txt"
WORDS = []

PHRASES = {
    "class %%%(%%%):":
       "Make a class named %%% that is-a %%%.",
    "class %%%(object):\n\tdef __init__(self, ***)" :
      "class %%% has-a __init__ that takes self and *** parameters.",
    "class %%%(object):\n\tdef ***(self, @@@)":
      "class %%% has-a function named *** that takes self and @@@ parameters.",
    "*** = %%%()":
      "Set *** to an instance of class %%%.",
    "***.***(@@@)":
      "From *** get the *** function, and call it with parameters self, @@@.",
    "***.*** = '***'":
      "From *** get the *** attribute and set it to '***'."
}

# do they want to drill phrases first
PHRASE_FIRST = False
if len(sys.argv) == 2 and sys.argv[1] == "english":
    PHRASE_FIRST = True

# load up the words from the website
for word in urlopen(WORD_URL).readlines():
    WORDS.append(word.strip())


def convert(snippet, phrase):
    class_names = [w.capitalize() for w in
                   random.sample(WORDS, snippet.count("%%%"))]
    other_names = random.sample(WORDS, snippet.count("***"))
    results = []
    param_names = []

    for i in range(0, snippet.count("@@@")):
        param_count = random.randint(1,3)
        param_names.append(', '.join(random.sample(WORDS, param_count)))

    for sentence in snippet, phrase:
        result = sentence[:]

        # fake class names
        for word in class_names:
            result = result.replace("%%%", word, 1)

        # fake other names
        for word in other_names:
            result = result.replace("***", word, 1)

        # fake parameter lists
        for word in param_names:
           result = result.replace("@@@", word, 1)

        results.append(result)

    return results


# keep going until they hit CTRL-D
try:
    while True:
        snippets = PHRASES.keys()
        random.shuffle(snippets)

        for snippet in snippets:
            phrase = PHRASES[snippet]
            question, answer = convert(snippet, phrase)
            if PHRASE_FIRST:
                question, answer = answer, question

            print question

            raw_input("> ")
            print "ANSWER:  %s\n\n" % answer
except EOFError:
    print "\nBye"
  1. I don't understand this bit

    for sentence in snippet, phrase: result = sentence[:]

What does sentence[:] suppose to do? I tried the code without [:] and it worked, so I'm very confused. Perhaps it's just there to make things more confusing for no reasong? Because I also noticed, that

  1. This code:

    for i in range(0, snippet.count("@@@")): param_count = random.randint(1,3) param_names.append(', '.join(random.sample(WORDS, param_count)))

I can rewrite into something less confusing param_names = random.sample(WORDS, snippet.count("@@@")), which then also begs the question why to do in such way?

Sorry for the n00bish post, but a help would mean a lot!

tentkl
  • 85
  • 8
  • 1. `sentence[:]` is a copy of `sentence`. See [Understanding Python's slice notation](https://stackoverflow.com/questions/509211/understanding-pythons-slice-notation). I don't know for what purpose `sentence` needed to be copied. – khelwood Feb 27 '18 at 11:22
  • @khelwood i understand its a copy and all, but the question is what purpose does it serve in this code – tentkl Feb 27 '18 at 11:39
  • 1
    It serves no evident purpose. – khelwood Feb 27 '18 at 12:14

0 Answers0