У меня есть список, в котором есть элементы, которые являются либо dict
либо что-то еще.
Я хочу написать метод, который печатает список, каждый элемент в строке, но специальные случаи dicts; что-то вроде:
def printSpecialList(mylist):
for item in mylist:
if itemIsDict(item):
printDictItem(item)
else:
print str(item)
Я могу реализовать все, кроме itemIsDict
- что это самый простой способ сделать это?
просто разъяснение:
Источник этого списка создает элементы, использующие словарные литералы, например {'a': 3, 'b': 4}
, что делает его громоздким для использования специальных типов словарей, которые умеют форматировать себя. Кроме того, мой метод printSpecialList
немного сложнее, и у него есть собственное частное состояние, которое оно включает в себя, поэтому тестирование экземпляра, хотя и "yucky" (например, кто-то не мог сделать издевательский класс dict, который не сходит с dict, что будет работать с моим методом), кажется, лучший способ пойти сюда.
def itemIsDict(item):
return isinstance(item, dict)
Вы можете подклассифицировать dict
и реализовать метод __repr__
или __str__
:
class MyDict(dict):
__str__(self):
# you write your custom string format
return 'my custom formatted string'
Таким образом, ваш код будет обрабатывать каждый элемент таким же образом:
for item in mylist:
print item
Примечание. Если вы хотите следовать этому подходу, более подробную информацию можно найти в официальной документации
isinstance(item, dict)
будет делать то, что вы просите, но нужно сказать, что ветвление по типу переменной довольно не-питоновское.
dict
не знает, как отформатировать себя так, как я хочу, в то время как я знаю.
Используя type()
if type(item) == dict:
print "Dictionary!"
dict
, даже такие объекты, для (почти) всех намерений и целей, являются совершенно допустимыми словарями.
{'a': 3, 'b': 4}