2017-05-06 2 views
-1

Ich habe einige Probleme mit /quote in PSET 7 von CS50. Jedes Mal, wenn ich in die CS50 Finanz Website gehen, gibt sie:CS50 PSET7 'NoneType' Fehler

AttributeError: 'NoneType' object has no attribute 'startswith' 

Ich bin nicht sicher, was es bedeutet, noch wie es zu beheben. Es scheint in der Lookup-Funktion automatisch zu "None" zu gehen, aber ich bin mir nicht sicher warum. Wenn mir jemand helfen könnte, würde ich es sehr schätzen!

Das ist mein Zitat Teil application.py:

@app.route("/quote", methods=["GET", "POST"]) 
@login_required 
def quote(): 
    """Get stock quote.""" 
    if request.method == "POST": 
     symbol = request.args.get("symbol") 
     quote = lookup(symbol) 
     return render_template("quoted.html", name=quote) 
    else: 
     return render_template("quote.html") 

Das ist mein helpers.py, die nicht sollte geändert werden:

def lookup(symbol): 
    """Look up quote for symbol.""" 

    # reject symbol if it starts with caret 
    if symbol.startswith("^"): 
     return None 

    # reject symbol if it contains comma 
    if "," in symbol: 
     return None 

    # query Yahoo for quote 
    # http://stackoverflow.com/a/21351911 
    try: 
     url = "http://download.finance.yahoo.com/d/quotes.csv?f=snl1&s={}".format(symbol) 
     webpage = urllib.request.urlopen(url) 
     datareader = csv.reader(webpage.read().decode("utf-8").splitlines()) 
     row = next(datareader) 
    except: 
     return None 

    # ensure stock exists 
    try: 
     price = float(row[2]) 
    except: 
     return None 

    # return stock's name (as a str), price (as a float), and (uppercased) symbol (as a str) 
    return { 
     "name": row[1], 
     "price": price, 
     "symbol": row[0].upper() 
    } 

Schließlich, dies ist mein Angebot. html:

{% extends "layout.html" %} 

{% block title %} 
    Quote 
{% endblock %} 

{% block main %} 
    <form action="{{ url_for('quote') }}" method="post"> 
     <fieldset> 
      <div class="form-group"> 
       <input autocomplete="off" autofocus class="form-control" name="symbol" placeholder="symbol" type="symbol"text"/> 
      </div> 
      <div class="form-group"> 
       <button class="btn btn-default" type="submit">Search for Quote</button> 
      </div> 
     </fieldset> 
    </form> 
{% endblock %} 
+0

Fügen Sie in Zukunft bitte die vollständige Stapelüberwachung ein, einschließlich Zeilennummern und Dateinamen, nicht nur die Fehlermeldung. –

Antwort

0

ich die Antwort finden verwalten, war ich setzen soll:

symbol = request.form.get("symbol") statt: symbol = request.args.get("symbol").

1

Dieser Fehler würde auftreten, wenn in der Anforderung kein "symbol" Parameter vorhanden ist.

symbol = request.args.get("symbol") 
    quote = lookup(symbol) 

Weil es nicht vorhanden ist, .get(...) wird None zurückkehren, und wenn Sie lookup(None) aufrufen wird es versuchen, die folgende Zeile laufen, mit symbol als None:

if symbol.startswith("^"): 

Was bedeutet, dass Sie versuchen, Do None.startswith(...), erklären den Fehler, den Sie sehen.

Sie könnten nach dem Fall suchen, in dem symbol fehlt/None und eine Fehlermeldung anzeigen.

symbol = request.args.get("symbol") 
    if symbol: 
     quote = lookup(symbol) 
     return render_template("quoted.html", name=quote) 
    else: 
     return render_template("missing_symbol.html") 

Oder Sie könnten es einfach ignorieren: Wenn kein Symbol gibt es, die Anforderung wahrscheinlich ungültig ist, und man kann annehmen, dass es einen Fehler verursacht.

+0

Vielen Dank. Ich fragte mich, wie ich prüfen könnte, ob das Symbol fehlte/nicht? – Emikko29

+0

@ Emikko29 Ich bin froh, dass es geholfen hat! Wenn dies Ihr Problem gelöst hat, haben Sie die * Option *, es als "akzeptierte"/richtige Antwort auszuwählen, indem Sie auf das ✔️-Häkchen auf der linken Seite klicken. –

+0

@ Emikko29 Entschuldigung, ich habe die Frage in Ihrem Kommentar missverstanden. Mein Fehler. Wenn Sie es noch nicht gefunden haben: Sie könnten das 'if'-Symbol in request.args verwenden, um zu überprüfen, ob es dort ist, auch wenn es' None' ist. –