所以,我试图成为一名优秀的 Python 程序员并尽可能地使用鸭子类型,但我的输入是一个字典或字典的列表。
我不能区分它们是否可迭代,因为它们都是。
我的下一个想法就是简单地调用 list(x)
并希望返回我的列表完整且给我一个字典作为列表中唯一的项;可惜,它只给我了字典键的列表。
现在,我已经正式没有了想法(除了调用isinstance
,众所周知,这不是很 Python)。我只想最终得到一个字典列表,即使我的输入只是一个单独的字典。
所以,我试图成为一名优秀的 Python 程序员并尽可能地使用鸭子类型,但我的输入是一个字典或字典的列表。
我不能区分它们是否可迭代,因为它们都是。
我的下一个想法就是简单地调用 list(x)
并希望返回我的列表完整且给我一个字典作为列表中唯一的项;可惜,它只给我了字典键的列表。
现在,我已经正式没有了想法(除了调用isinstance
,众所周知,这不是很 Python)。我只想最终得到一个字典列表,即使我的输入只是一个单独的字典。
json.loads
),那么使用isinstance
没有问题。if isinstance(dict_or_list, collections.abc.Mapping):
return [dict_or_list]
else:
return dict_or_list
dict
和list
这样的东西也继承自collections
ABCs,不过,知道这点很酷。 - Morgan Harrislist
实际上是一个内置类型,不继承任何东西,isinstance([], Sequence)
仍然为True。 - abarnertMutableSequence.register(list)
的调用了吗?这就足以告诉Python,list
实现了MutableSequence
(因此也实现了它的祖先Sequence
、Sized
、Iterable
、Container
)。 - abarnert使用非int
键访问dict
会得到一个项,或者是一个KeyError
。使用一个list
会得到一个TypeError
。因此,您可以使用异常处理:
def list_dicts(dict_or_list):
try:
dict_or_list[None]
return [dict_or_list] # no error, we have a dict
except TypeError:
return dict_or_list # wrong index type, we have a list
except Exception:
return [dict_or_list] # probably KeyError but catch anything to be safe
items
属性。
dict
有这个属性而list
没有。>>> hasattr({}, 'items')
True
>>> hasattr([], 'items')
False
dict
和list
属性名称之间的差异完整列表。
list
上的属性但不在dict
上:>>> print('\n'.join(sorted(list(set(dir([])) - set(dir({}))))))
__add__
__iadd__
__imul__
__mul__
__reversed__
__rmul__
append
count
extend
index
insert
remove
reverse
sort
dict
上的属性,但不在list
上:
>>> print('\n'.join(sorted(list(set(dir({})) - set(dir([]))))))
fromkeys
get
items
keys
popitem
setdefault
update
values
try:
data.keys()
print "Probs just a dictionary"
except AttributeError:
print "List o' dictionaries!"
你能否直接使用数据进行操作,并在出现问题时决定它是字典还是列表?
不要使用 types 模块:
import types
d = {}
print type(d) is types.DictType
l = [{},{}]
print type(l) is types.ListType and len(l) and type(l[0]) is types.DictType
isinstance
不太符合 Python 风格?如果是这样,我将打破这个规则。此外,Python cookbook 中有一些使用它的示例。如果你们说isinstance
不够 Pythonic,我会开始怀疑自己加入了什么样的修道院。 - erewokisinstance
对于几乎所有输入都有效。这实际上只是一个哲学问题...我之所以问,是因为我相信有一些聪明、简洁、Pythonic的方法我还没有想到,这会让我感觉更好。 - Morgan Harrisisinstance
必然会阻止鸭子类型,这在我看来不符合 Python 的风格。 - Morgan Harrisx.items()
而是用list(x)
?x.items()
会给你一个键值对列表。 - Akavall