【问题标题】:__str__ and single vs double quote behavior in Python__str__ 和 Python 中的单引号和双引号行为
【发布时间】:2012-04-07 12:01:10
【问题描述】:

如果我用字符串定义一个字典

d = {"5": 5}

用单引号打印显示

>> print d
>> {'5': 5}

有没有办法让它用双引号打印?

编辑:

完整的故事是我最初将树定义为嵌套字典并使用 json 在语言之间传输它。然后我决定将字典包装在一个类中,但这破坏了我将其编码为 json 的方法。

【问题讨论】:

  • 为什么会出现这个问题?
  • 正确地做到这一点,涵盖所有极端情况,会很困难。如果您实际上是在尝试编写 JSON 输出,请使用 json 模块。

标签: python quotes


【解决方案1】:

是的(假设您有 json 模块):

>>> import json
>>> print json.dumps({'5': 5})
{"5": 5}
>>> 

关于使用print 时的引号数量,Python docs 说:

如果字符串包含一个 单引号,没有双引号,否则用单引号括起来 引号。

【讨论】:

  • 请注意,如果您的 dict 包含不可 JSON 序列化的类型(例如 bytes),这将不起作用。
  • 更糟糕的是:它将假定所有字典键都是字符串; print json.dumps({5:5}){"5": 5}。这是由 JSON 标准规定的。
  • @hochl 在此处想要双引号的主要原因,除了或多或少不相关的审美偏好之外,是您实际上是在尝试输出 JSON。
  • @matt 具有讽刺意味的是,我想将只能通过打印输出的 dict 转换为 json 对象。
【解决方案2】:

是的:创建你自己的函数来遍历字典,构建你自己的字符串表示,然后打印出来。

或者,将其编码为 JSON 或 YAML,这可能会满足您的需求。

【讨论】:

    【解决方案3】:

    您可以创建字典类型的子类并定义自己的字符串表示:

    class MyDict(dict):
        def __repr__(self):
            return "my representation"
    

    例如:

    >>> d = MyDict()
    >>> d["5"] = 5
    >>> d
    my representation
    

    【讨论】:

      【解决方案4】:

      你可以这样做:

      >>> d = {"5": 5}
      >>> for key,value in d.items():
          print('{{"{0}": {1}}}'.format(key,value))
      
      
      {"5": 5}
      

      如果你想用format方法输出{,只需使用双{


      这是使用__str__方法的解决方案:

      from __future__ import print_function
      from itertools import chain,izip,repeat
      
      class singleQuoteDict(dict):
          def __str__(self):
              return ''.join(chain(('{'),
                            (j for i in izip(
                                chain([''],repeat(', ')),
                                ('"{0}": {1!r}'.format(key,value) for key,value in self.items()))
                             for j in i),
                            ('}')))
      
      
      d = singleQuoteDict({"5": 5, "10": 10})
      print(d)
      

      输出:

      {"10": 10, "5": 5}
      

      【讨论】:

      • 最好使用'{{"{0}": {1!r}}}' 来确保值来自repr() 而不是str()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 2011-05-08
      • 1970-01-01
      • 2013-12-14
      • 2013-02-16
      相关资源
      最近更新 更多