2017-07-03 35 views
0

我正面臨KeyError我無法解釋或理解。 我有一個筆記本,我在其中一個單元定義一個變量PREFIX格式化當地人時出現KeyError

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

這簡直是包含日誌的文件夾的路徑,所以在使用筆記本的人只需要更改路徑,如果他們想執行下面的代碼。

然後,後來(相當一堆之下的細胞),我使用它,沒有任何問題:

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) 

然後我得到我所期望的輸出,這意味着文件被發現(很長)輸出正在打印日誌。

我有一些說明我對這個問題的實現結構更多的細胞,並在時機成熟時再執行同一段代碼,我得到了KeyError

代碼帶來錯誤:

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

,並且在下一單元:

demo_synthetic_dig_dag(200) 

Jupyter輸出:

--------------------------------------------------------------------------- 
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' 

我敢肯定,這個錯誤是相當簡單和愚蠢的,但是,如果有人能夠睜開我的眼睛,我會非常感激!

回答

1

功能外,locals()globals()相同,所以你沒有問題。

當放置在函數內部,不過,locals()不含任何方式PREFIX(它被存儲在globals(),它包含的本地名稱該功能。這就是爲什麼格式化這些失敗,它試圖讓一個名爲關鍵PREFIX從字典從locals()字典返回

而是與%格式化的,爲什麼不使用.format

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

或者,你可以把PREFIX在局部範圍內有一個額外的參數給你的函數:

def demo_synthetic_dig_dag(data_size, PREFIX=PREFIX): 

,但我沒有看到一個倒置的了這一點。 (是的,本地查找有一個小的性能提升,但我懷疑它會起作用)

+0

工作正常,非常感謝!我對Python非常陌生,並且不知道'.format'方法......是今天學習它的好機會! –

+0

太好了。一般來說,您應該閱讀方法字符串提供的['.format'](https://docs.python.org/3.6/library/string.html#format-string-syntax)方法,它通常是首選的方式格式化字符串在Python 3中。('f'字符串是另一種新的方式,但不需要再看看) –

+0

好吧,我會按照建議:) –