在python中,如何测试类似字符串的对象是否可变?

ton*_*nfa 6 python

我有一个函数,它采用类似字符串的参数.

我想决定是否可以安全地存储参数并确保它不会改变.所以我想测试它是否可变,例如是否buffer()构建的结果array.array().

目前我使用:

type(s) == str
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

(复制参数太昂贵了,这就是为什么我要避免它)

Bas*_*ard 5

最好使用

isinstance(s, basestring)
Run Code Online (Sandbox Code Playgroud)

它也适用于Unicode字符串.


u0b*_*6ae 4

如果这只是您的缓存的启发式方法,请使用任何有效的方法。例如,isinstance(x, str) 几乎与现在一模一样。(假设您想要决定是否缓存;错误测试仅意味着缓存未命中,您没有做任何错事。)


(备注:事实证明,缓冲区对象是可散列的,即使它们的字符串表示形式可能会在您的脚下发生变化;下面的散列讨论很有趣,但并不是它想要的纯粹解决方案。)

然而,如果实例是不可变的,则良好实现的类应该具有可哈希的实例,而如果它们是可变的,则不应具有可哈希的实例。一般测试是对您的对象进行哈希处理并测试是否成功。

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

我确信这会产生误报,但可变对象可哈希严格来说是一个接口中断;我希望python 库类型遵循这个接口,对一个小样本的测试给出了正确的答案:

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