检查[]运算符

Max*_*Max 7 python

如何在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原则是,要求宽恕更容易获得许可.

该语言旨在通过例外执行此操作.

  • 哇......我印象深刻.我刚刚运行了一组测试,通过异常来解决这个问题就是*fast*.甚至比测试`__getitem__`的否定案更快!我真的要重新思考如何在Python中使用异常...... (2认同)

cho*_*own 7

试试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)

查看操作员模块:

等等..