Python 带“quot;”的键的字符串格式:&引用;及/&引用;
存在带有Python 带“quot;”的键的字符串格式:&引用;及/&引用;,python,python-2.7,string-formatting,Python,Python 2.7,String Formatting,存在带有:和/的格式字符串。尝试使用值dict格式化时,会抛出: ValueError: Missing ']' in format string 例如: In [312]: value Out[312]: {'key:/key_part': 1} In [313]: string_to_format Out[313]: '{v[key:/key_part]}' In [314]: string_to_format.format(v=SafeDict(value)) -----------
:
和/
的格式字符串。尝试使用值dict
格式化时,会抛出:
ValueError: Missing ']' in format string
例如:
In [312]: value
Out[312]: {'key:/key_part': 1}
In [313]: string_to_format
Out[313]: '{v[key:/key_part]}'
In [314]: string_to_format.format(v=SafeDict(value))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-314-3ee97d9dfb86> in <module>()
----> 1 string_to_format.format(v=SafeDict(value))
ValueError: Missing ']' in format string
关于如何解决这个问题有什么想法吗?这是字符串格式化实现中使用的基本解析的已知限制。中的部分介绍了
str.format
语法中的“getitem”支持(重点):
“getitem”语法的一个示例:
“我的名字是{0[name]}”。格式(dict(name='Fred'))
需要注意的是,在格式字符串中使用“getitem”比其常规用法要有限得多。在上面的示例中,字符串“name”实际上是文本字符串“name”,而不是名为“name”的变量。解析项键的规则非常简单。如果它以一个数字开头,那么它将被视为一个数字,否则它将被用作一个字符串
由于键不以引号分隔,因此无法从格式字符串中指定任意字典键(例如字符串“10”或“:-]”)
随后在“实施说明”下:
str.format()
这是str.format设计上的一个缺点。细心的读者可能会注意到OP的字符串格式在Python3中工作。在Python3.4中修补了一些边缘案例,但在Python3.3及以下版本中仍然存在相同的问题
有关的罚单被没收了。由于Python 2.7现在已经过时,从Python 3.4后端口到2.7的改进机会为零,因此您必须在两个选项中进行选择:
升级到Python 3
重构代码,使字符串格式仅使用简单的名称或数字
这是字符串格式化实现中使用的基本解析的已知限制。中的部分介绍了str.format
语法中的“getitem”支持(重点):
“getitem”语法的一个示例:
“我的名字是{0[name]}”。格式(dict(name='Fred'))
需要注意的是,在格式字符串中使用“getitem”比其常规用法要有限得多。在上面的示例中,字符串“name”实际上是文本字符串“name”,而不是名为“name”的变量。解析项键的规则非常简单。如果它以一个数字开头,那么它将被视为一个数字,否则它将被用作一个字符串
由于键不以引号分隔,因此无法从格式字符串中指定任意字典键(例如字符串“10”或“:-]”)
随后在“实施说明”下:
str.format()
这是str.format设计上的一个缺点。细心的读者可能会注意到OP的字符串格式在Python3中工作。在Python3.4中修补了一些边缘案例,但在Python3.3及以下版本中仍然存在相同的问题
有关的罚单被没收了。由于Python 2.7现在已经过时,从Python 3.4后端口到2.7的改进机会为零,因此您必须在两个选项中进行选择:
升级到Python 3
重构代码,使字符串格式仅使用简单的名称或数字
更改为Python3,在那里它可以工作。也许string_to_format='{v}';string_to_format.format(v=SafeDict(value)['key:/key_part'])
取而代之?@0x5453格式字符串中会有多个键,如上所述。我想这在多个键上不起作用。@wim,是的,我已经在python3中尝试过了,而且很有效。但是我需要这个来代替python2。关于如何在python2中实现这一点有什么想法吗?@Yogaraj No.在python2中不起作用,也永远不会起作用,因为它是EOL.Change to Python3,在那里它起作用。也许string_to_format='{v}';string_to_format.format(v=SafeDict(value)['key:/key_part'])
取而代之?@0x5453格式字符串中会有多个键,如上所述。我想这在多个键上不起作用。@wim,是的,我已经在python3中尝试过了,而且很有效。但是我需要这个来代替python2。关于如何在python2中实现这一点有什么想法吗?@Yogaraj No.在python2中不起作用,而且永远不会,因为它是EOL。谢谢。我已经重构了我的代码,用一个简单的标识符替换了:/
。谢谢。我已经重构了我的代码,用一个简单的标识符替换了:/
。
In [311]: class SafeDict(dict):
...: def __missing__(self, key):
...: return "NULL"