【发布时间】:2014-03-20 00:01:20
【问题描述】:
我需要测试从带有ConfigParser 的文件(和evaled)读入的对象是否是映射。
不完全确定这里的术语,但让我解释一下。鉴于我的对象被称为O,它必须支持以下列方式使用:
def tester(**kwargs):
print kwargs
tester(**O)
如果 O 不支持 ** 这将导致 TypeError,例如TypeError: test() argument after ** must be a mapping, not tuple.
这是一个非常简单的场景,但我需要知道O 在使用它之前会起作用,并且我需要绝对确定它不会失败。如果我正在测试 O 是否是可迭代的,我会使用类似的东西:
try:
iter(O)
except:
O = tuple()
如In Python, how do I determine if an object is iterable? 中所述
我找不到任何平行的映射。正如上面相同答案中所讨论的,使用isinstance 和collections 不是一个好的解决方案。
所以在加载对象时,我是否必须将上面的测试器功能(没有打印)作为我自己的映射测试
try:
tester(**O)
except TypeError:
O = {}
或者 python 是否有一个内置的方法来测试这个,就像对可迭代对象一样?好像应该有。
编辑
实际上上面的链接答案从未反对 isinstance 方法,应该更好地阅读它......
【问题讨论】:
-
另见python-custom-mapping-class-unpacking-and-keys-attribute - 关于
**kwarg风格的解包如何需要一个显式命名为keys的方法,该方法返回一个可迭代列表以及__getitem__。