关于python:检查[]运算符

Check for [] operator

如何检查对象是否支持python中的[]操作?我想到了以下几点:

1
2
if supports(obj, ?[]?):
    print("Supports")

你的"检查适当的支持。"你只是使用它。

1
2
3
4
try:
    a = obj[whatever]
except TypeError:
    # whatever your fall-back plan is when obj doesn't support [] (__getitem__)

写作是你自己的事isinstance总是错误的。这不是新的类型的集合的类仍然可以从ABC有正确的行为。鸭打字,你可以永远依靠isinstance均值。

写作你自己的hasattr测试仅仅是内部的检查duplicates Python的异常引起的。由于Python必须重复的测试,这是为什么呢?

最后,我认为这将是与异常处理代码是不可读的错误。。。。。。。"。。。。。。。在许多经验丰富的Python的原理,用Python程序员接受的是,它的更容易问到让这对forgiveness许可。

语言设计了一种带到这样的异常。


hasattr(obj,"__getitem__")试试:

1
2
if hasattr(obj,"__getitem__"):
    print("Supports")

operator.getitem帮助:

1
2
3
4
5
6
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].

退房的操作模块。

  • Return the value of a at index b:

    1
    2
    operator.getitem(a, b)
    operator.__getitem__(a, b)
  • Return the slice of a from index b to index c-1:

    1
    2
    operator.getslice(a, b, c)
    operator.__getslice__(a, b, c)
  • Set the value of a at index b to c:

    1
    2
    operator.setitem(a, b, c)
    operator.__setitem__(a, b, c)
  • Set the slice of a from index b to index c-1 to the sequence v.

    1
    2
    operator.setslice(a, b, c, v)
    operator.__setslice__(a, b, c, v)
  • Remove the value of a at index b:

    1
    2
    operator.delitem(a, b)
    operator.__delitem__(a, b)
  • Delete the slice of a from index b to index c-1:

    1
    2
    operator.delslice(a, b, c)
    operator.__delslice__(a, b, c)

等。


在内部算子是一[]__getitem__名称(和__setitem__),所以你可以以很好的稳定:在这。

1
2
if hasattr(obj, '__getitem__'):
    print"Supports"


有一个简单的方式,如果你能看到以上的对象(例如,一iterate的for i in obj):

1
2
3
import collections
if isinstance(obj, collections.Iterable):
    print 'obj supports iteration'

如果你需要什么,如果你可以使用一个电流检测的重点,"我所要求的只是建议而不是forgiveness"的权限:

1
2
3
4
5
6
try:
    value = obj[key]
except (AttributeError, TypeError, IndexError):
    # These are different things that can return in different situations
    value = None
    print 'I guess that key doesn\'t work'

唯一的原因,我会用这个方法suggest collections.Iterable相反的是,有人在你的周围环tryfor知道另一种复杂的,可以得到。


你可以检查看如果有一类的每__getitem__方法,将语言的文档。