2016-05-03 8 views
-1

Der Versuch, ein Skript von "Lerne Python auf die harte Tour" zu starten und diesen Fehler zu bekommen, probierte mehrere Dinge aus, aber ich stecke irgendwie fest. Gesehen ähnliche Fehler bei Menschen mit argv und nicht genug Argumente, wenn das Skript ausgeführt wirdPython "brauchen mehr als 1 Wert zum Entpacken"

Fehlerpunkte auf Linie 70:

question, answer = convert(snippet, phrase) 

vollständige 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" 
+0

Mögliche Duplikat [Valueerror: Notwendigkeit, mehr als 1 Wert auspacken] (https://stackoverflow.com/questions/19749077/valueerror-need-more-than-1-value-to-entpacken) –

Antwort

-1

Problem

in Ihrem Code konvertieren() gibt eine Liste, die eine Objekt oder Wert ist. Wenn Sie question, answer = convert(snippet, phrase) tun, erwarten Sie, dass zwei Werte zurückgegeben und dann in question und answer eingefügt werden.

Lösung

Sie sollten eine Änderung

question, answer = convert(snippet, phrase) 

zu

results = convert(snippet, phrase) 

Sie können dann aus den Ergebnissen Frage und Antwort bekommen (vorausgesetzt, sie bei Indizes 0 und 1) durch dabei

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

Danke, wirklich nervig, wenn Sie von etwas lernen, das nicht korrekt ist. Der oben angegebene Code stammt direkt aus dem Buch. Ich werde versuchen, es zu optimieren, wie Sie sagten – craigread7

+0

Ok, kommentieren, wenn Sie irgendwelche Probleme haben. – MattCorr

+0

Wie löst dies das Problem von OP? Wie Sie bemerkt haben, hat die Liste nur ein Element (das von Ihrem Code sieht so aus, wahrscheinlich aufgrund schlechten Eindrucks).Also wird das Auspacken in zwei Variablen genauso fehlschlagen wie das Indizieren, als ob zwei Elemente fehlschlagen würden ... Dies ist ein Problem für ein anderes. – Pythonista

1

Sie versuchen, zwei Werte entpacken von results, die von Ihrer Funktion convert(*args) zurückgegeben wird.

In Ihrer Funktion convert geben Sie jedoch eine Liste mit einem einzelnen Element result zurück, das an results angehängt ist. Also, Sie haben nur einen Wert nicht zwei

Aus Gründen der Vollständigkeit auspacken ....

Lassen Sie uns sagen, dass Ihre Funktion convertzurückgegeben mehr als zwei Werte in dieser Liste und Sie versuchten, sie zu entpacken. Sie erhalten auch einen Fehler, aber dieses Mal haben Sie zu viele Werte zum Entpacken. In diesem Fall, dass Sie etwas tun, nach dem Vorbild dieser:

some_var, *other = convert(snippet, phrase) 
1

Die obigen Kommentare sind korrekt für das Problem, das bei Ihnen auftritt, jedoch zeigt das angegebene Codebeispiel keine korrekte Einrückung. Die for sentence in snippet, phrase-Schleife in der Klasse fügt den zusätzlichen Wert nicht an, der dann zu einem korrekten question, answer = convert(snippet, phrase) führt. Ändern Sie den Code an die unten und es sollte gut laufen (getestet es hier):

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 
Verwandte Themen