格式化本地人时出现 KeyError
KeyError when formatting locals
我面临着一个KeyError
我无法解释或理解的问题。
我有一个笔记本,其中我在单元格中定义了一个变量 PREFIX
:
PREFIX = "/home/mavax/Documents/info/notebook/log_study"
这只是一个包含日志的文件夹的路径,因此使用笔记本的人如果想执行下面的代码,只需更改路径即可。
然后,后来(下面一大堆cell),我用了,没问题:
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'
我很确定这个错误很简单而且很愚蠢,但是,如果有人能开阔我的眼界,我将非常感激!
在函数外,locals()
与 globals()
相同,所以您没有问题。
但是,当放在一个函数中时,locals()
不以任何方式包含 PREFIX
(它存储在 globals()
中,它包含该函数的局部名称。这就是格式化这些失败的原因,它试图从 locals()
字典返回的字典中获取名为 PREFIX
的键。
为什么不使用 .format
:
而不是使用 %
格式化
"{}/datasets/logs/{}s".format(PREFIX, basename)
或者,您可以将 PREFIX
带入局部作用域,并为您的函数添加一个附加参数:
def demo_synthetic_dig_dag(data_size, PREFIX=PREFIX):
但我看不到 多少 的好处。 (是的,本地查找有一个小的性能提升,但我怀疑它会发挥作用)
我面临着一个KeyError
我无法解释或理解的问题。
我有一个笔记本,其中我在单元格中定义了一个变量 PREFIX
:
PREFIX = "/home/mavax/Documents/info/notebook/log_study"
这只是一个包含日志的文件夹的路径,因此使用笔记本的人如果想执行下面的代码,只需更改路径即可。
然后,后来(下面一大堆cell),我用了,没问题:
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'
我很确定这个错误很简单而且很愚蠢,但是,如果有人能开阔我的眼界,我将非常感激!
在函数外,locals()
与 globals()
相同,所以您没有问题。
但是,当放在一个函数中时,locals()
不以任何方式包含 PREFIX
(它存储在 globals()
中,它包含该函数的局部名称。这就是格式化这些失败的原因,它试图从 locals()
字典返回的字典中获取名为 PREFIX
的键。
为什么不使用 .format
:
%
格式化
"{}/datasets/logs/{}s".format(PREFIX, basename)
或者,您可以将 PREFIX
带入局部作用域,并为您的函数添加一个附加参数:
def demo_synthetic_dig_dag(data_size, PREFIX=PREFIX):
但我看不到 多少 的好处。 (是的,本地查找有一个小的性能提升,但我怀疑它会发挥作用)