【问题标题】:KeyError when formatting locals格式化本地时出现 KeyError
【发布时间】:2017-07-03 11:50:29
【问题描述】:

我面对的是KeyError,我无法解释或理解。 我有一个笔记本,在其中我在一个单元格中定义了一个变量PREFIX

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'

我很确定这个错误很简单而且很愚蠢,但是,如果有人能睁开我的眼睛,我将非常感激!

【问题讨论】:

    标签: python python-3.x jupyter-notebook keyerror


    【解决方案1】:

    在函数之外,locals()globals() 相同,所以你没有问题。

    但是,当放在函数中时,locals() 不会以任何方式包含 PREFIX(它存储在 globals() 中,它包含该函数的本地名称。这就是格式化这些失败的原因,它正在尝试从locals() 字典返回的字典中获取一个名为PREFIX 的键。

    为什么不使用% 格式化,而不是使用.format

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

    或者,您可以将PREFIX 带入本地范围,并为您的函数添加一个附加参数:

    def demo_synthetic_dig_dag(data_size, PREFIX=PREFIX):
    

    但我没有看到 太多 这样做的好处。 (是的,本地查找的性能提升很小,但我怀疑它会发挥作用)

    【讨论】:

    • 工作正常,非常感谢!我对python很陌生,不知道.format方法....今天学习它的好机会!
    • 太好了。一般来说,您应该阅读字符串提供的.format 方法,它通常是在 Python 3 中格式化字符串的首选方法。(f-strings 是另一种较新的方法,但还不需要查找)
    • 好的,我会听从建议的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多