craigread7 craigread7 - 7 months ago 21
Python Question

python "need more than 1 value to unpack"

Trying to run a script from "Learn Python the hard way" and getting this error, tried several things but I'm kinda stuck. Seen similar errors with people using argv and not enough arguments when running the script

Error points to Line 70:

question, answer = convert(snippet, phrase)


full code:

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, nd 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)

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"

Answer

Problem

In your code, convert() returns a list, which is one object, or value. By doing question, answer = convert(snippet, phrase), you are expecting two values to be returned, and then inserted into question and answer.

Solution

You should a change

question, answer = convert(snippet, phrase)

to

results = convert(snippet, phrase)

You can then get question and answer from results(assuming they are at indices 0 and 1) by doing

question = results[0]
answer = results[1]