Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 17, 2011 09:22:02

indus
От:
Зарегистрирован: 2011-02-07
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка типа объекта - концептуальный вопрос.

Доброго всем времени суток!

Я начинающий питонер и хочу прояснить для себя один очень важный вопрос, который мне в силу неопытности или недопонимания кажется больше религиозным нежели практичным.
Речь идет о проверке типа объекта в функции - является ли это признаком непонимания основ Питона достойная порицания и насмешек (нарушается концепция - все является анонимным объектом) или же это чистой воды религия вроде абсолютного неприятия goto?

Т.е. например есть функция, принимающая строку (т.е. я хочу/ожидаю получать именно строку, а не что-то иное):

def some_func( value ):
if isinstance( value, str ):
# Do something
является ли такой подход неправильным и нарушающим принципы программирования на Питоне?
можете ли вы привести случаи очевидного нарушения базовых концепций? например, не так давно я здесь упорно пытался доказать необходимость использования “слепых” исключений для “максимального контроля за ситуацией” - самому себе то я это доказал, за что впоследствии и поплатился…

Спасибо!



Офлайн

#2 Июнь 17, 2011 09:42:32

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Проверка типа объекта - концептуальный вопрос.

Можно использовать во внешних библиотеках, (якобы интерфейс), зависит от цели.
Я почти нигде не использую проверку типа, т.к. когда вызываю some_func всегда передаю строку (для данного примера), а если прилетела не строка, то выскочит исключение - исправлю ошибку, что-б прилетала строка.

Офлайн

#3 Июнь 17, 2011 09:47:23

indus
От:
Зарегистрирован: 2011-02-07
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка типа объекта - концептуальный вопрос.

o7412369815963
Можно использовать во внешних библиотеках, (якобы интерфейс), зависит от цели.
Я почти нигде не использую проверку типа, т.к. когда вызываю some_func всегда передаю строку (для данного примера), а если прилетела не строка, то выскочит исключение - исправлю ошибку, что-б прилетала строка.
т.е. проверку типа можно отнести к сокрытию преступления/ошибки?
вы лично считаете это серьезным недочетом или не станете даже поднимать вопрос если увидите такой код у своего коллеги? т.е. увидели - ну и что- забыл…



Офлайн

#4 Июнь 17, 2011 10:09:32

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

Проверка типа объекта - концептуальный вопрос.

У себя в коде стараюсь всячески избегать явной проверки типа (лучше проверять интерфейс или концепцию).
НО, строка помоему единственный объект - подобъектами которого рекурсивно являются строки, поэтому со строками такое иногда приходится использовать.



Офлайн

#5 Июнь 17, 2011 10:21:31

indus
От:
Зарегистрирован: 2011-02-07
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка типа объекта - концептуальный вопрос.

doza_and
У себя в коде стараюсь всячески избегать явной проверки типа (лучше проверять интерфейс или концепцию).
НО, строка помоему единственный объект - подобъектами которого рекурсивно являются строки, поэтому со строками такое иногда приходится использовать.
не могли бы вы привести конкретный пример оправданного использования проверки типа (для лучшего понимания)?
что вы имели ввиду под “лучше проверять интерфейс или концепцию”? что это означает на практике?



Офлайн

#6 Июнь 17, 2011 10:24:45

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

Проверка типа объекта - концептуальный вопрос.

Принимаются предложения, скажем, по реализации json.dumps без проверки типов.



Офлайн

#7 Июнь 17, 2011 14:27:32

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

Проверка типа объекта - концептуальный вопрос.

можно каждому классу добавить метод __json__() который будет возвращать json представление О.о



Офлайн

#8 Июнь 17, 2011 15:31:32

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

Проверка типа объекта - концептуальный вопрос.

как быть с int и str?



Офлайн

#9 Июнь 18, 2011 21:56:11

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Проверка типа объекта - концептуальный вопрос.

Обычно вместо проверки типов лучше использовать hasattr(object, attrname) (в общем-то - и есть проверка интерфейса).
Т.е для реализации json.dumps я бы использовал hasattr(object, “__json_dump__”) для объектов, которые знают, как себя задампить в json; и проверку типов для остальных - часть будет засериализовано (если json реализация знает что с ними делать), но если объект - не первое и не второе, то выбросить исключение.



Офлайн

#10 Июнь 19, 2011 03:25:17

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

Проверка типа объекта - концептуальный вопрос.

Мы недавно на работе об этом говорили.
Я все еще не уверен, что hasattr лучше. Это по крайней мере не всегда верно.
В качестве примера приведу io. В двойке была путаница. Слишком много возможных атрибутов у file object. writer реализовывал обязательный write. Нужно ли каждый раз в коде перед вызовом flush проверять — а есть ли такой метод? Как быть с fileno или encoding? Если encoding отсутствует — это значит что поток бинарный или просто программист забыл определить? Другими словами, что нужно передавать в write — str или bytes?
И так далее.
Как мне кажется duck typing далеко не всегда лучший выбор.

И да, не могу не вспомнить казус с hasattr, починеный в 3.2 с подачи Юры Селиванова. Если атрибут не находился, а __getattr__ выбрасывал *любое* исключение — то hasattr считал, что атрибута нет. Теперь он так делает только если исключение было типа AttributeError.

Cчитаю, что duck typing и проверку типов нужно совмещать, смотря каждый раз поместу. Не следует городить дерево наследования только для того, чтобы проверять тип. Но если дерево получается естественным, то стоит рассмотреть возможность проверки на isinstance — такой код может быть удобней для востриятия.

Запутанные вопросы производительности для простоты опущу.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version