繁体   English   中英

检查[]个运算符

[英]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而不是此方法的唯一原因是, tryfor循环中绕过谁知道还有什么可能会变得很复杂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM