我有一个变量(来自数据库的对象)。在某些情况下,此变量可以是列表的类型,在某些情况下可以是词典。
变量标准为列表:
for value in object_values:
self.do_something(value)
变量标准为字典:
for key, value in object_values.items():
self.do_something(value)
我可以使用instanceof()
两次检查类型,但是我仍然需要两个函数或if
两个for
周期。我现在有if
条件,它调用两个函数中的一个,一个用于迭代为列表(例如iterate_list()
),第二个用于迭代为字典(例如iterate_dict()
)。
有没有更好的选择如何优雅和更加pythonic方式解决问题,我不知道该变量是列表还是字典?
答案 0 :(得分:5)
在您的情况下,由于数据是字典的项目或值,您可以使用三元组来获取values()
或仅使用可迭代的类型:
def iterate(self,object_values):
for value in object_values.values() if isinstance(object_values,dict) else object_values:
self.do_something(value)
如果你传递了tuple
,生成器或其他可迭代的内容,它会重新回到"标准"迭代。如果您传递字典(或OrderedDict
或其他字典),则会迭代值。
在性能方面,三元表达式仅在迭代开始时计算一次,所以很好。
isinstance
位甚至可以被if hasattr(object_values,"values")
替换,因此即使具有values
成员的非dict对象也会匹配。
(请注意,您应该了解"最少的声音和#34;原则。有些人可能期望在调用方法时对字典的键进行迭代)