我有一个类似这个的功能
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))
其中魔术是所有可以包含其他序列对象的序列对象的ABC,例如
但不是:
恐怕这是不可能的,因为tuple和str有相同的7个ABCs:
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]发布于 2017-03-14 10:36:55
问得好。
isinstance(x, str)。bytes和bytearray )可以使用collections.abc.ByteString ABC进行区分。当然,您也可以定义自己的ABC,包括str和ByteString,甚至可以给它一个检查类的__subclasshook__,比如capitalize。
发布于 2017-03-14 10:41:49
你的魔法叫做types.StringTypes。它不是抽象的基类,但它是我们拥有的最好的类。
来自https://docs.python.org/2/library/types.html#types.StringTypes (重点雷):
包含
StringType和UnicodeType的序列,用于方便检查任何字符串对象。使用它比使用在其他地方构造的两个字符串类型的序列更具可移植性,因为它只包含在运行版本的Python中构建的UnicodeType。例如:isinstance(s, types.StringTypes)。 新版本2.2。
https://stackoverflow.com/questions/42781267
复制相似问题