【问题标题】:Key Error in Python string with format call带有格式调用的 Python 字符串中的键错误
【发布时间】:2018-01-10 18:59:55
【问题描述】:

以下代码报错:

filename='foo.txt'
sed_str = 'PROJECT_DIR=\$\{PROJECT_DIR:-{}\}'.format(filename)
print (sed_str) 

结果:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
 <ipython-input-12-9ac4d7cde75e> in <module>()
      1 filename='foo.txt'
----> 2 sed_str = 'PROJECT_DIR=\$\{PROJECT_DIR:-{}\}'.format(filename)
      3 print (sed_str)

KeyError: 'PROJECT_DIR'

为什么我会看到 KeyError?

【问题讨论】:

  • {....} 被解释为格式说明符。
  • 摆脱你的大括号:'s#PROJECT_DIR=\$\{{PROJECT_DIR:-.*\}}#PROJECT_DIR=\$\{{PROJECT_DIR:-{0}\}}'.format('filename')
  • f-strings 可能会使您的字符串构建更具可读性:python.org/dev/peps/pep-0498
  • 是的。他们在之前的调试尝试中丢失了。
  • 顺便说一句。我不同意这是重复的。是的,另一个链接提供了回答问题所需的信息,但该答案与字典或关键错误无关。所以这是一个特例,但没有重复。我无法使用呈现给我的错误消息找到其他答案。同样,不是重复的,因为无法通过此错误消息路径找到信息。

标签: python string python-3.x


【解决方案1】:

正如您在问题的 cmets 中提到的,您需要转义不属于需要格式化的花括号。这是您遇到的问题的示例解决方案:

Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> sed_str = 's#PROJECT_DIR=\$\{PROJECT_DIR:-.*\}#PROJECT_DIR=\$\{PROJECT_DIR:-{0}\}#'
>>> print(sed_str)
s#PROJECT_DIR=\$\{PROJECT_DIR:-.*\}#PROJECT_DIR=\$\{PROJECT_DIR:-{0}\}#
>>> sed_str = 's#PROJECT_DIR=\$\{{PROJECT_DIR:-.*\}}#PROJECT_DIR=\$\{{PROJECT_DIR:-{0}\}}#'.format('filename')
>>> print(sed_str)
s#PROJECT_DIR=\$\{PROJECT_DIR:-.*\}#PROJECT_DIR=\$\{PROJECT_DIR:-filename\}#
>>> 

如果您拥有最新版本的 Python 之一,您可能需要考虑使用 f'' 字符串来创建您的 sed_str 变量:

>>> path = 'filename'
>>> sed_str = f's#PROJECT_DIR=\$\{{PROJECT_DIR:-.*\}}#PROJECT_DIR=\$\{{PROJECT_DIR:-{path}\}}#'
>>> print(sed_str)
s#PROJECT_DIR=\$\{PROJECT_DIR:-.*\}#PROJECT_DIR=\$\{PROJECT_DIR:-filename\}#
>>> 

【讨论】:

  • 顺便说一句。 f-strings 也发生了同样的错误,这就是为什么我在试图解决这个问题时将它们取出的原因。
  • @RaySalemi 您在运行与上面所示完全相同的代码时遇到任何问题吗?
  • 不,答案是正确的。我不得不承认我不知道 {{ 和 }}。
  • 我已编辑您的答案以匹配简化的问题。
【解决方案2】:

使用{{}} 转义格式字符串中的花括号:

filename='foo.txt'
sed_str = 'PROJECT_DIR=\$\{{PROJECT_DIR:-{}\}}'.format(filename)
print (sed_str) 

给予:

PROJECT_DIR=\$\{PROJECT_DIR:-foo.txt\}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2015-11-13
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多