2017-07-03 3 views
0

Ich bin konfrontiert mit KeyError Ich kann nicht erklären oder verstehen. Ich habe ein Notizbuch, in dem ich eine Variable PREFIX in einer Zelle definieren:KeyError beim Formatieren von Locals

PREFIX = "/home/mavax/Documents/info/notebook/log_study" 

, die in einen Ordner enthält Protokolle einfach ein Weg ist, so dass die Leute das Notebook mit nur den Pfad ändern müssen, wenn sie wollen Führen Sie den folgenden Code aus.

Dann später (eine ganze Reihe von Zellen unter), ich benutze es, ohne Probleme:

for basename in ["log_converted_full.txt", "log_converted_trimmed.txt"]: 
    entries = load_log_for_insertion("%(PREFIX)s/datasets/logs/%(basename)s" % locals()) 
    pprint(entries) 

ich dann die Ausgabe erhalte ich erwarte, Dateien Bedeutung gefunden und der (sehr lange) Ausgang von den Protokollen wird gedruckt.

Ich habe einige mehr Zellen Beschreibung der Struktur I für dieses Problem implementieren, und wenn die Zeit wieder das gleiche Stück Code auszuführen kommt, erhalte ich die KeyError:

-Code den Fehler zu bringen:

def demo_synthetic_dig_dag(data_size): 
    for basename in ["alert_converted_trimmed.txt"]: 
     ### 
     entries = load_log_for_insertion("%(PREFIX)s/datasets/logs/%(basename)s" % locals())[:data_size] 
     g = AugmentedDigDag() 
     g.build(entries) 

     html(
      """ 
      <table> 
       <tr><td>%s</td></tr> 
      </table> 
      """ % (
       synthetic_graph_to_html(g, 2, 0.03) 
      ) 
     ) 

und in der nächsten Zelle:

demo_synthetic_dig_dag(200) 

Jupyter output:

--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 
<ipython-input-179-7c2a79d0afd6> in <module>() 
----> 1 demo_synthetic_dig_dag_armen(200) 

<ipython-input-178-d17f57de3c01> in demo_synthetic_dig_dag(data_size) 
    18  for basename in ["log_converted_trimmed.txt"]: 
    19   ### 
---> 20   entries = load_log_for_insertion("%(PREFIX)s/datasets/logs/%(basename)s" % locals())[:data_size] 
    21   g = AugmentedDigDag() 
    22   g.build(entries) 

KeyError: 'PREFIX' 

Ich bin ziemlich sicher, dass der Fehler ziemlich einfach und einfach dumm ist, aber dennoch, wenn jemand meine Augen öffnen könnte, wäre ich sehr dankbar!

Antwort

1

Außerhalb einer Funktion, locals() ist das gleiche wie globals(), so dass Sie kein Problem haben.

Wenn innerhalb einer Funktion platziert, aber nicht locals() nicht PREFIX in irgendeiner Weise enthält (in globals() gespeichert ist, enthält es die lokalen Namen für diese Funktion. Deshalb diese Formatierung nicht, es versucht, einen Schlüssel mit dem Namen zu bekommen PREFIX aus dem Wörterbuch, das von dem locals() dict

Statt mit % formatiert werden kann, warum nicht nur .format benutzen.

"{}/datasets/logs/{}s".format(PREFIX, basename) 

Alternativ könnten Sie 01 bringenim lokalen Bereich mit einem zusätzlichen Parameter an die Funktion:

def demo_synthetic_dig_dag(data_size, PREFIX=PREFIX): 

aber ich sehe nicht viel eines umge darauf. (Ja, es gibt einen kleinen Leistungsschub für die lokale Suche, aber ich bezweifle, dass es eine Rolle spielen würde)

+0

hat gut funktioniert, vielen Dank! Ich bin ziemlich neu bei Python und kannte die '.format'-Methode nicht .... eine gute Gelegenheit, heute darüber zu lernen! –

+0

Das ist großartig. Im Allgemeinen sollten Sie die Methode [.format] (https://docs.python.org/3.6/library/string.html#format-string-syntax) lesen, die die Strings bereitstellen. Dies ist im Allgemeinen der bevorzugte Weg format string in Python 3. ('f'-Strings sind ein weiterer neuer Weg, aber keine Notwendigkeit, das zu suchen) –

+0

OK, ich werde den Rat befolgen :) –

Verwandte Themen