python: распечатка списка и специальные инструкции

1

У меня есть список, в котором есть элементы, которые являются либо 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, что будет работать с моим методом), кажется, лучший способ пойти сюда.

Теги:
polymorphism

4 ответа

6
Лучший ответ
def itemIsDict(item):
    return isinstance(item, dict)
2

Вы можете подклассифицировать 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

Примечание. Если вы хотите следовать этому подходу, более подробную информацию можно найти в официальной документации

  • 0
    Я понимаю это, но у меня есть существующий код, который составляет этот список, и я не хочу, чтобы он использовал MyDict вместо литералов, таких как {'a': 3, 'b': 4}
2

isinstance(item, dict) будет делать то, что вы просите, но нужно сказать, что ветвление по типу переменной довольно не-питоновское.

  • 0
    Я знаю об этом, но не вижу реальной альтернативы: объект dict не знает, как отформатировать себя так, как я хочу, в то время как я знаю.
0

Используя type()

if type(item) == dict:
    print "Dictionary!"
  • 3
    За исключением того, что это не распознает подтипы dict , даже такие объекты, для (почти) всех намерений и целей, являются совершенно допустимыми словарями.
  • 0
    Ах, так в чем же разница между типом и экземпляром? Спасибо, я этого не знал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню