"类似字符串"和"类似字节"是什么意思?



阅读有关Python类型的描述string-likebyte-like引起了我的注意。我找不到一个适当的定义,这些到底是什么意思以及如何正确使用这些术语。例如,我在以下Python Cookbook部分阅读:

basestringstrunicode类型的公共基类,用户代码可能定义的任何类似字符串的类型也应该basestring子类,只是为了确保此类isinstance测试按预期工作。

那么现在说任何从basestring派生的东西都可以被认为是字符串状的,这是否正确?甚至是什么让它string-like,它是返回类型?

<type>-like是任何与该类型类似的对象。Python 广泛依赖鸭子类型;如果它像鸭子一样走路和嘎嘎叫,那就是鸭子。如果它的行为像一个字符串,它可能是一个。

因此,文档告诉您,如果您要创建一个希望在任何地方都被视为字符串的自定义类型,那么子类化basestring可能是一个想法。 这样,任何明确想要使用isinstance(obj, basestring)测试字符串类型(字节或 unicode 文本)的代码也将接受您的自定义类型。

你仍然必须实现最少的预期方法集;从basestring继承不会神奇地使你的类型工作。该最小设置取决于您尝试欺骗的代码如何操作字符串。你的类型必须足够像字符串,才能欺骗你使用你的类型的任何内容。

是的,这是故意模糊的,并不是所有代码都可以被欺骗(一些内置函数和类型希望能够在字符串对象上使用 C API,甚至进入str内部)。通常,更容易只对strunicode进行子类化,以确保不会遗漏任何内容。

从那以后,该语言已经摆脱了这样的基类,而是定义了抽象基类,现在,这些基类与用于自定义子和实例检查的钩子一起,是在一个检查中进行鸭子输入的推荐方法。

最新更新