[英]Check for [] operator
如何检查对象是否支持Python中的[]操作? 我想到以下内容:
if supports(obj, ?[]?):
print("Supports")
您不会“检查支持”。 您只需要使用它:
try:
a = obj[whatever]
except TypeError:
# whatever your fall-back plan is when obj doesn't support [] (__getitem__)
编写自己的isinstance
总是错误的事情。 不从集合ABC类继承的新类型仍然可以具有正确的行为。 Duck Typing意味着您永远不能依赖isinstance
。
编写自己的hasattr
测试仅能重复Python的内部检查,该检查会引发异常。 既然Python 必须做测试,为什么要重复做呢?
最后,“我认为,通过处理异常代码,可读性会下降。” 是假的。 许多经验丰富的Python程序员都接受Python原则,即请求宽恕比请求宽容要容易。
该语言旨在做到这一点,但有例外。
试试hasattr(obj, "__getitem__")
:
if hasattr(obj, "__getitem__"):
print("Supports")
从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].
检查操作员模块 :
返回索引b处a的值:
operator.getitem(a, b) operator.__getitem__(a, b)
将a的片段从索引b返回到索引c-1:
operator.getslice(a, b, c) operator.__getslice__(a, b, c)
将索引b处a的值设置为c:
operator.setitem(a, b, c) operator.__setitem__(a, b, c)
将从索引b到索引c-1的a的切片设置为序列v。
operator.setslice(a, b, c, v) operator.__setslice__(a, b, c, v)
删除索引b处a的值:
operator.delitem(a, b) operator.__delitem__(a, b)
从索引b到索引c-1删除a的切片:
operator.delslice(a, b, c) operator.__delslice__(a, b, c)
等等..
[]
运算符的内部名称是__getitem__
(和__setitem__
),因此您可以通过以下方式对此进行相当有效的刺入:
if hasattr(obj, '__getitem__'):
print "Supports"
您可以按照语言docs检查类是否具有__getitem__
方法。
有一种简单的方法可以查看是否可以遍历对象(即, for i in obj
):
import collections
if isinstance(obj, collections.Iterable):
print 'obj supports iteration'
如果您担心要检查是否可以使用实际的密钥,我建议您只是“寻求宽恕”而不是许可:
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'
我建议使用collections.Iterable
而不是此方法的唯一原因是, try
在for
循环中绕过谁知道还有什么可能会变得很复杂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.