为什么map(str,self.my_list)在my_list的元素上调用__repr__而不是__str __?

时间:2017-04-12 22:35:19

标签: python

我已经阅读了答案here,并且每个人似乎都同意将str映射到列表应该在该列表的每个元素上调用element.__str__,但是{{1}正在被调用。我已经完成了代码,并且正在正确生成列表。

My Collection包装器如下所示:

__repr__

class Wrapper: def __init__(self, *args): self.foo = list(args) def __str__(self): return ", ".join(map(str, self.foo)) 开始,它会跳转到包含的类中的Wrapper.__str__()。该课程如下:

__repr__

当我使用调试器逐步执行代码时,执行会直接从class MyType: def __init__(self, arg1, arg2, arg3): self.arg1 = arg1 # set the other values def __repr__(self): return "I am a repr" def __str__(self): return "I am a str" 中的地图行跳转到Wrapper中的__repr__。如果我致电MyType,我会跳转到str(wrapper_instance.foo[0])。为什么会这样?

编辑:Wrapper是被调用的实际类型的超类,尽管子类没有实现__str__。子类定义如下所示:

__str__

为了遵守非主题规则并回答有关如何调用代码的一些问题,我正在进行的具体调用是:

class SubWrapper(Wrapper):
    def __init__(self, definite_arg, *args):
        super().__init__(args)
        self.definite_arg = definite_arg

    def __repr__(self):
        return "I am a subclass repr"

EDIT_2:事实证明问题出在班级的构建中 - >>> w = Wrapper(MyType(1, 2, 3), MyType(4, 5, 6)) >>> s = SubWrapper(MyType(7, 8, 9), MyType(1, 2, 3), MyType(4, 5, 6)) >>> print(str(w)) I am a str, I am a str >>> print(str(s)) (I am a repr, I am a repr) >>> print(", ".join(map(str, w.foo))) I am a str, I am a str >>> print(", ".join(map(str, s.foo))) (I am a repr, I am a repr) 应该致电SubWrapper.__init__

1 个答案:

答案 0 :(得分:0)

如果您打印内置容器,它将使用每个项目 1 的表示形式:

>>> [MyType(), MyType()]
[I am a repr, I am a repr]

>>> print([MyType(), MyType()])
[I am a repr, I am a repr]

>>> Wrapper(MyType(), MyType()).foo
[I am a repr, I am a repr]

但是,如果你map每个元素到一个字符串,那么它(显然)将使用字符串表示:

>>> ','.join(map(str, [MyType(), MyType()]))
'I am a str,I am a str'

>>> print(Wrapper(MyType(), MyType()))
I am a str, I am a str

因此,无论您在容器上使用list还是__repr__,内置容器(如str)内的项目都会显示repr。您明确需要转换每个项目,以便使用其__str__方法显示它。

1 我从__init__删除了MyType方法。这只会使代码片段“缩短”并减少卷积。