在Python中如何测试字符串类对象是否可变?
我有一个函数,它接收一个类似字符串的参数。
我想判断这个参数是否可以安全地存储,并且确保它不会改变。所以我想测试一下它是否是可变的,比如说通过 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