Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 12, 2011 20:06:05

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

строка или список

Допустим у нас есть функция, один из аргументов которой может быть как отдельным элементом, так и последовательностью элементов.
И пусть в качестве этого аргумента передана строка. Одно из правил хорошего тона рекомендует основываться не на типе значения, а на его интерфейсе. Но вот строка то отлично поддерживает интерфейс последовательности, результат правда удручает :)
Понятно что всегда можно сделать

if isinstance(arg, StringTypes):
но как-то некрасиво. А как вы решаете эту ситуацию? Или стараетесь избегать?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано (Апрель 12, 2011 20:06:58)

Офлайн

#2 Апрель 12, 2011 20:13:00

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

строка или список

На мой взгляд isinstance — хорошее решение.
А интерфейс — это что? И чем он так сильно отличается от типа?



Офлайн

#3 Апрель 12, 2011 20:36:00

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

строка или список

isinstance решение может и хорошее - но мне всегда мешало что элементы строки - строки

a="123"
type(a)==type(a[0])
Это мешает строить итераторы по элементам произвольных рекурсивных контейнеров - приводит к зацикливанию.



Отредактировано (Апрель 12, 2011 20:36:52)

Офлайн

#4 Апрель 12, 2011 20:41:14

Studentik
От:
Зарегистрирован: 2009-12-26
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

строка или список

def myfunc(arg):
if type(arg) is str: return myfunc([arg])
for v in arg:
print(v)



Офлайн

#5 Апрель 12, 2011 20:51:02

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

строка или список

Я имел ввиду чтото типа

def it(obj):
if hasattr(obj,"next"):
for sub in obj:
it(sub)
else:
yield obj
итерирует листики древовидного представления объекта.



Офлайн

#6 Апрель 13, 2011 05:38:05

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

строка или список

Андрей Светлов
А интерфейс — это что? И чем он так сильно отличается от типа?
Ну набор методов класса, типа ходит как утка, крякает как утка. Так сказать не по названию, а по факту.

Попробовал сейчас найти ту статью, не смог.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Апрель 13, 2011 08:09:44

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

строка или список

PooH
Ну набор методов класса, типа ходит как утка, крякает как утка. Так сказать не по названию, а по факту.
+1

Жестких проверок на тип надо избегать. Но увы, иногда нужно обобщенный алгоритм ими чуть-чуть ограничивать.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version