在Python中如何测试字符串类对象是否可变?

6 投票
4 回答
1252 浏览
提问于 2025-04-15 14:03

我有一个函数,它接收一个类似字符串的参数。

我想判断这个参数是否可以安全地存储,并且确保它不会改变。所以我想测试一下它是否是可变的,比如说通过 array.array() 创建的 buffer() 的结果,或者不是。

目前我使用的是:

type(s) == str

有没有更好的方法呢?

(复制这个参数太耗资源了,所以我想避免这样做)

4 个回答

3

只需使用鸭子类型就可以了——记住,有时候“请求原谅比请求许可更简单”。尝试去修改那个像字符串的对象,如果不行的话,准备好处理可能出现的错误。

5

最好使用下面这个方法:

isinstance(s, basestring)

这个方法也适用于Unicode字符串。

4

如果你只是想为缓存设置一个启发式方法,那就用能用的东西就行。比如说,使用 isinstance(x, str) 这个方法,几乎和现在的做法一样。(前提是你想决定是否要缓存;如果测试结果是 False,那就意味着缓存没有命中,你也没做错什么。)


(备注:其实缓冲区对象是可以被哈希的,尽管它们的字符串表示可能会随时变化;下面关于哈希的讨论很有趣,但并不是它最初想要的纯粹解决方案。)

不过,设计得好的类应该在不可变的情况下其实是可以被哈希的,而可变的情况下则不应该。一个简单的测试方法就是对你的对象进行哈希操作,然后检查是否成功。

>>> hash({})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: dict objects are unhashable

我敢肯定这会出现误判,但可变对象被哈希这件事严格来说是违反了接口的规则;我会期待 Python 的库类型遵循这个接口,测试一小部分样本也能得到正确的结果:

hashabe: str (Immutable), buffer (Warning, immutable slice of (possibly) mutable object!)
unhashable: list, array.array

撰写回答