代码之家  ›  专栏  ›  技术社区  ›  Kiikurage

Python标准库中是否有关于“str(some_list)”的规范?[副本]

  •  0
  • Kiikurage  · 技术社区  · 7 年前

    我想知道为什么 list.__str__() __repr__()

    class A:
        def __repr__(self):
            return 'repr()'
    
        def __str__(self):
            return 'str()'
    
    print(str([A(), A()]))  # output: [repr(), repr()]
    

    (screen shot)

    首先,我尝试在其他python解释器中运行上述代码,得到了相同的结果。

    然后我在谷歌上搜索这个行为是否在规范中定义过,但是我找不到任何关于它的文档 的程序。我找到了 this document

    是否有任何规格 list.__str__ 是否存在?

    3 回复  |  直到 7 年前
        1
  •  0
  •   Yann Vernier    7 年前

    这可能没有明确指定,但肯定有其逻辑。您正在查看的是 repr str list 类型如果您阅读以下文档: __str__ ,这表明默认实现是依靠 __repr__ 不应生成有效的Python表达式,而 是作为Python标准类型,列表自然会显示为有效表达式,因此应该具有repr,repr也将依赖于为包含的项调用repr,否则表达式可能会中断。

    最后我们有一个问题:str和repr的列表应该如何显示不同?例如,这是一副牌的类型可能产生的地方 "queen of hearts" 而不是 Card(1,12) . 列表没有明显的选择,所以它没有 __str公司__

    我们甚至可以验证这种情况:

    >>> list.__str__
    <slot wrapper '__str__' of 'object' objects>
    >>> list.__repr__
    <slot wrapper '__repr__' of 'list' objects>
    

    这个 继承自 object list .

        2
  •  0
  •   MSeifert    7 年前

    在没有 __str__ 任何容器都默认为 __repr__ str list 等)通常没有 __str公司__ __报告__ __报告__ 打电话给 __报告__

    所以它不是正式的规范。只是因为这些容器没有 __str公司__

        3
  •  0
  •   Kirill Bulygin    7 年前

    我认为这种行为可以被认为是特定的。 https://docs.python.org/3/library/stdtypes.html#list 列表实现所有常见和可变序列操作的状态(其中没有一个包括 __str__ __repr__ )加 sort list.__str__ list.__repr__ (尽管如此,在CPython中你可以看到它们)。

    因此 str(a_list) str(a_list) -> repr(a_list) -> list.__repr__ -> object.__repr__ (自 list object ). 根据 https://docs.python.org/3/reference/datamodel.html#object. repr object.__repr__ [...] (其中每个元素是 repr