如何在Python中检查对象是否支持[]操作?我想到类似以下内容:
if supports(obj, ?[]?):
print("Supports")
Run Code Online (Sandbox Code Playgroud)
S.L*_*ott 14
你没有"检查支持".你只需使用它:
try:
a = obj[whatever]
except TypeError:
# whatever your fall-back plan is when obj doesn't support [] (__getitem__)
Run Code Online (Sandbox Code Playgroud)
编写自己isinstance的东西总是错误的.不从集合ABC类继承的新类型仍然可以具有正确的行为.鸭子打字意味着你永远不能依赖isinstance.
编写自己的hasattr测试只会复制Python引发异常的内部检查.由于Python 必须进行测试,为什么要复制呢?
最后,"我认为通过异常处理,这些代码的可读性会降低." 是假的.许多经验丰富的Python程序员都接受的Pythonic原则是,要求宽恕更容易获得许可.
该语言旨在通过例外执行此操作.
试试hasattr(obj, "__getitem__"):
if hasattr(obj, "__getitem__"):
print("Supports")
Run Code Online (Sandbox Code Playgroud)
从operator.getitem帮助:
operator.getitem??
Type: builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form: <built-in function getitem>
Namespace: Interactive
getitem(a, b) -- Same as a[b].
Run Code Online (Sandbox Code Playgroud)
查看操作员模块:
返回at索引b的值:
Run Code Online (Sandbox Code Playgroud)operator.getitem(a, b) operator.__getitem__(a, b)将索引b的切片返回到索引c-1:
Run Code Online (Sandbox Code Playgroud)operator.getslice(a, b, c) operator.__getslice__(a, b, c)将索引b的值设置为c:
Run Code Online (Sandbox Code Playgroud)operator.setitem(a, b, c) operator.__setitem__(a, b, c)将索引b的切片设置为索引c-1到序列v.
Run Code Online (Sandbox Code Playgroud)operator.setslice(a, b, c, v) operator.__setslice__(a, b, c, v)删除at索引b的值:
Run Code Online (Sandbox Code Playgroud)operator.delitem(a, b) operator.__delitem__(a, b)将索引b的切片删除到索引c-1:
Run Code Online (Sandbox Code Playgroud)operator.delslice(a, b, c) operator.__delslice__(a, b, c)
等等..