是否有一种pythonics方法来区分序列对象,如“元组和列表”,来自Sequence对象,如“bytes和str”

时间:2017-03-14 08:42:04

标签: python-3.x abc

我有一个像这样的功能

def print_stuff(items):
    if isinstance(items, (str, bytes)):
        items = (items,)
    for item in items:
        print (item)

可以按如下方式调用:

In [37]: print_stuff(('a', 'b'))
a
b

In [38]: print_stuff('a')
a

我不喜欢isinstance (items, (str, bytes))我更愿意做isinstance(item, (collections.abc.MAGIC))

其中MAGIC是所有序列对象的ABC,可以包含其他序列对象,例如

  • 元组
  • 列表
  • numpy.array
  • 一些用户定义的矢量类等

但不是:

  • STR
  • 字节
  • UTF-16等用户定义的str类

我担心这是不可能的,因为tuplestr具有相同的7个ABC :(

In [49]: [v for k, v in vars(collections.abc).items()
    ...:                                   if inspect.isclass(v) and issubclass(tuple, v) ]
Out[49]:
[collections.abc.Hashable,
 collections.abc.Iterable,
 collections.abc.Reversible,
 collections.abc.Sized,
 collections.abc.Container,
 collections.abc.Collection,
 collections.abc.Sequence]

In [50]: [v for k, v in vars(collections.abc).items()
    ...:                                   if inspect.isclass(v) and issubclass(list, v) ]
Out[50]:
[collections.abc.Iterable,
 collections.abc.Reversible,
 collections.abc.Sized,
 collections.abc.Container,
 collections.abc.Collection,
 collections.abc.Sequence,
 collections.abc.MutableSequence]

In [51]: [v for k, v in vars(collections.abc).items()
    ...:                                   if inspect.isclass(v) and issubclass(str, v) ]
Out[51]:
[collections.abc.Hashable,
 collections.abc.Iterable,
 collections.abc.Reversible,
 collections.abc.Sized,
 collections.abc.Container,
 collections.abc.Collection,
 collections.abc.Sequence]

2 个答案:

答案 0 :(得分:2)

好问题。

  • (目前)没有ABC将字符串与元组或其他不可变序列区分开来;由于Python 3中只有一种字符串类型,因此最Pythonic解决方案确实带有isinstance(x, str)
  • 可以使用bytes ABC区分bytearraycollections.abc.ByteString等字节序列类型。

当然,您也可以定义自己的ABC,其中包括strByteString,甚至可以给它__subclasshook__检查capitalize等方法的类}。

答案 1 :(得分:0)

您的魔法称为$(trigger_obj).on('loading_complete', function () { \\ logic ... }); 。它不是抽象基类,但它是我们最好的基础类。

来自https://docs.python.org/2/library/types.html#types.StringTypes(强调我的):

  

包含types.StringTypesStringType 的序列用于促进   更容易检查任何字符串对象。使用它更便携   而不是使用其他地方构建的两种字符串类型的序列   因为它只包含UnicodeType,如果它已在运行中构建   Python版本。例如:UnicodeType

     

2.2版中的新功能。