代码之家  ›  专栏  ›  技术社区  ›  Lerner Zhang

如何将str转换为unicode?[副本]

  •  0
  • Lerner Zhang  · 技术社区  · 6 年前

    __str__ __repr__ 用蟒蛇?

    0 回复  |  直到 5 年前
        1
  •  3
  •   Sampath    5 年前

    Alex 总结得不错,但令人惊讶的是,过于简洁。

    首先,让我重申 Alex’s post :

    • __repr__ 目标是明确
    • __str__
    • 容器 __str公司__ 使用包含的对象

    默认实现是无用的

    __代表__ 表现为:

    return "%s(%r)" % (self.__class__, self.__dict__)
    

    可能太危险了(例如,如果对象相互引用,就很容易陷入无限递归)。所以巨蟒就出来了。注意,有一个默认值是真的:如果 __代表__ __str公司__ 不是,对象的行为会像 __str__=__repr__

    这意味着,简单地说:几乎你实现的每个对象都应该有一个函数 __代表__ 这对理解物体是有用的。实施 __str公司__

    目标 是明确的

    让我直接说出来,我不相信调试器。我真的不知道如何使用任何调试器,从来没有认真使用过。此外,我相信调试器的大错误是它们的基本性质大多数我调试的失败都发生在很久以前,在遥远的星系里。这意味着我相信,带着宗教热情,在伐木。日志记录是任何像样的fire and forget服务器系统的生命线。Python使记录变得容易:使用一些特定于项目的包装器,您只需要

    log(INFO, "I am in the weird function and a is", a, "and b is", b, "but I got a null C — using default", default_c)
    

    但是您必须完成最后一步,确保实现的每个对象都有一个有用的repr,这样的代码就可以正常工作了。这就是为什么评估会出现:如果你有足够的信息 eval(repr(c))==c ,这意味着你知道一切 c . 如果这足够简单,至少在模糊的方式,做它。如果没有,确保你有足够的信息 c类 无论如何。我通常使用类似eval的格式: "MyClass(this=%r,that=%r)" % (self.this,self.that)

    注:我用过 %r 上面没有 %s . 你总是想用 repr() [或 %右 格式化字符,相当于]内部 实施,或者你正在挫败repr的目标。你想要能够区分 MyClass(3) MyClass("3") .

    目标 __str公司__ 是可读的

    具体地说,并不打算明确地注意到 str(3)==str("3")

    容器 __str公司__ __代表__

    这看起来很奇怪,不是吗?有一点,但是如果它使用 ?

    [moshe is, 3, hello
    world, this is a list, oh I don't know, containing just 4 elements]
    

    不是很好。特别是,容器中的字符串会发现很容易干扰其字符串表示。面对模棱两可的情况,请记住,Python抵制猜测的诱惑。如果你想在打印列表时有上述行为,只需

    print "[" + ", ".join(l) + "]"
    

    摘要

    实施 __代表__ 对于您实现的任何类。这应该是第二天性。实施 如果你认为有一个字符串版本在可读性方面出错是有用的。

        2
  •  3
  •   prosti    5 年前

    我的经验法则: __repr__ __str__ 是给顾客的。