首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种仿生学方法来区分像“元组和列表”这样的序列对象和像“字节和str”这样的序列对象?

有没有一种仿生学方法来区分像“元组和列表”这样的序列对象和像“字节和str”这样的序列对象?
EN

Stack Overflow用户
提问于 2017-03-14 08:42:03
回答 2查看 1.5K关注 0票数 10

我有一个类似这个的功能

代码语言:javascript
复制
def print_stuff(items):
    if isinstance(items, (str, bytes)):
        items = (items,)
    for item in items:
        print (item)

这可以称为如下:

代码语言:javascript
复制
In [37]: print_stuff(('a', 'b'))
a
b

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

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

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

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

但不是:

  • 应激
  • 字节数
  • 一些用户为UTF-16定义str类,等等。

恐怕这是不可能的,因为tuplestr有相同的7个ABCs:

代码语言:javascript
复制
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]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-14 10:36:55

问得好。

  • (目前)没有ABC将字符串与元组或其他不可变序列区分开来;因为Python3中只有一种字符串类型,所以大多数Python解决方案实际上是使用一个isinstance(x, str)
  • 字节序列类型(如bytesbytearray )可以使用collections.abc.ByteString ABC进行区分。

当然,您也可以定义自己的ABC,包括strByteString,甚至可以给它一个检查类的__subclasshook__,比如capitalize

票数 5
EN

Stack Overflow用户

发布于 2017-03-14 10:41:49

你的魔法叫做types.StringTypes。它不是抽象的基类,但它是我们拥有的最好的类。

来自https://docs.python.org/2/library/types.html#types.StringTypes (重点雷):

包含StringTypeUnicodeType 的序列,用于方便检查任何字符串对象。使用它比使用在其他地方构造的两个字符串类型的序列更具可移植性,因为它只包含在运行版本的Python中构建的UnicodeType。例如:isinstance(s, types.StringTypes)。 新版本2.2。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42781267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档