我有这样的功能
def print_stuff(items):
if isinstance(items, (str, bytes)):
items = (items,)
for item in items:
print (item)
Run Code Online (Sandbox Code Playgroud)
可以这样称呼:
In [37]: print_stuff(('a', 'b'))
a
b
In [38]: print_stuff('a')
a
Run Code Online (Sandbox Code Playgroud)
我不喜欢做,isinstance (items, (str, bytes))我更愿意做isinstance(item, (collections.abc.MAGIC))
其中MAGIC是所有序列对象的ABC,可以包含其他序列对象,例如
但不是:
恐怕这是不可能的,tuple并且str具有相同的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]
Run Code Online (Sandbox Code Playgroud)
好问题。
isinstance(x, str).bytes和bytearray可以使用ABC来区分collections.abc.ByteString。当然,您也可以定义自己的 ABC,其中包括str和ByteString,甚至给它一个__subclasshook__来检查类中的方法,例如capitalize。
| 归档时间: |
|
| 查看次数: |
548 次 |
| 最近记录: |