Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.99/76: Рейтинг темы: голосов - 76, средняя оценка - 4.99
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755

Точность выполнения кода в задачах жизни и смерти. Утиная типизация (Duck tuping)

19.11.2019, 07:48. Показов 15363. Ответов 125

Студворк — интернет-сервис помощи студентам
Это принцип в Python по аналогии, что когда что-то крякает, как утка и ходит, как утка, то это является уткой. Если буду писать программы, связанные с медицинской диагностикой с разветвлениями алгоритма в тысячи вариантов, то как избежать ошибок, чтобы программа не приняла одни данные за другие?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.11.2019, 07:48
Ответы с готовыми решениями:

Утиная типизация
Нужно ли проверять типы данных аргументов передаваемых в метод класса или функции, как лучше делать: проверять с помощью isinstance или...

Утиная типизация
Подскажите пожалуйста, две ситуации Первая, у меня есть метод который работает int float , но если будет передаваться, что-то другое...

дело жизни и смерти
У меня скоро конец семестра,а училка задала мне задачи,а я в паскале ничего не понимаю( Помогите,а то меня не аттестуют. и...

125
Эксперт .NET
 Аватар для Usaga
14314 / 9398 / 1355
Регистрация: 21.01.2016
Сообщений: 35,431
17.12.2019, 07:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от supmener Посмотреть сообщение
Чтобы сделать из Питона Аду?
Может сразу взять Аду?)
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
17.12.2019, 07:42  [ТС]
Тогда придется изучать еще один язык Ada. Пока в планах этого нет.
0
Эксперт .NET
 Аватар для Usaga
14314 / 9398 / 1355
Регистрация: 21.01.2016
Сообщений: 35,431
17.12.2019, 08:17
supmener, тогда нафига из питона делать язык изучения которого в планах нет? Где логика?
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
17.12.2019, 09:09  [ТС]
Чтобы зная синтаксис одного языка, не надо было учить синтаксис другого. В Ade могут проблемы с покупкой лицензии для платной версии.

Добавлено через 23 минуты
Прошу привести варианты примеров кода, если это возможно. Для следующей задачи:
- вставлять в каждую процедуру проверки типов всех используемых переменных
0
Эксперт .NET
 Аватар для Usaga
14314 / 9398 / 1355
Регистрация: 21.01.2016
Сообщений: 35,431
17.12.2019, 09:25
Цитата Сообщение от supmener Посмотреть сообщение
Чтобы зная синтаксис одного языка, не надо было учить синтаксис другого.
А нафига может потребоваться изучение и питона и ады одновременно? И почему именно ада? Почему не мейнстримовые языки?

Добавлено через 25 секунд
Цитата Сообщение от supmener Посмотреть сообщение
- вставлять в каждую процедуру проверки типов всех используемых переменных
Серьёзно, что ли?
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
17.12.2019, 10:36
Цитата Сообщение от supmener Посмотреть сообщение
Прошу привести варианты примеров кода, если это возможно. Для следующей задачи:
- вставлять в каждую процедуру проверки типов всех используемых переменных
Во-первых, вам это тут где-то уже приводили. Во-вторых, повторяю - не надо пытаться делать из питона static-typed язык, он не для этого. Хотите static typed - их много есть других, со своими развитыми системами проверки типов.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
17.12.2019, 11:40
Цитата Сообщение от Garry Galler Посмотреть сообщение
Достаточно создать свои классы с нужными ограничениями. Ничто не мешает программисту сделать также в Python.
Разве что его лень...
А ещё оно тормозить будет. Питон и так не быстрый язык (потому что интерпретируется, а не компилируется).

Цитата Сообщение от supmener Посмотреть сообщение
- вставлять в каждую процедуру проверки типов всех используемых переменных
Мало того, что оно тормозить будет, так ещё все эти проверки в runtime бессмысленны. Проверки нужны только в тех местах, где читаются недостоверные данные (ввод от пользователя, например).

Для всего остального: ассерты, которые удаляются из кода при оптимизирующей компиляции; или логирование подозрительных действий.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
17.12.2019, 13:31
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
А ещё оно тормозить будет.
В Python и так все на классах построено. Тормознее чем уже есть вряд ли будет. Иначе никто бы ни писал столько слоев абстракций (Django, тому пример, там столько нанизано классов друг на друга, что мама не горюй)
Вот хочет ТС, чтобы x=10 # минут нельзя было сложить с y = 12 # часов, а также x и y с друг другом.
Пожалуйста, создаем класс minute и класс hour.
И тогда minute(10) + hour(12) нельзя будет просто так сложить.

Ну типа так, на коленке...
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class minute():
    
    def __init__(self,op):
        if op in range(0,60):
            self.minute = op
        else:
            raise IndexError(
                'range object index out of range: {} not in {}..{}'.format(op,0,59)
            )
    
    def __add__(self,op):
        if isinstance(op,self.__class__):
            return minute(self.minute + op.minute)
        else:
            raise TypeError("unsupported operand type(s) for + {} с {}".format(
                self.__class__.__name__,op.__class__.__name__)
            )
 
class hour():
    
    def __init__(self,op):
        if op in range(0,24):
            self.hour = op
        else:
            raise IndexError(
                'range object index out of range: {} not in {}..{}'.format(op,0,23)
            )
        
    def __add__(self,op):
        if isinstance(op,self.__class__):
            return hour(self.hour + op.hour)
        else:
            raise TypeError("unsupported operand type(s) for + {} с {}".format(
                self.__class__.__name__,op.__class__.__name__)
            )
 
m = minute(10)
print((m + minute(10)).minute) 
#print(m + 10) # минуты с просто числом тоже будет нельзя сложить
 
h = hour(10)
print((h + hour(10)).hour) 
#print((m + hour(10)).hour) # минуты с часми низя
 
print(hour(25)) # выход за допустимый диапазон
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
17.12.2019, 13:49
Ты хитро сделал: возвращаешь новый объект.
Python
1
print(minute(59) + minute(42))
Code
1
IndexError: range object index out of range: 101 not in 0..59
Только диапазон я бы проверял так:
Python
1
if 0 < op < 60:
Не уверен в том, что возвращает range.

Добавлено через 2 минуты
А для ТСа скажу, что в стандартной библиотеке есть datetime, как и во многих "нормальных" языках.
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
17.12.2019, 14:22
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
А для ТСа скажу, что в стандартной библиотеке есть datetime
Это да. Но на месте Core Python developers я бы ее немножко переписал :-)
Примерно до такого
times
times.nim
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
17.12.2019, 20:41
Цитата Сообщение от supmener Посмотреть сообщение
если объявить две переменные: часы и минуты, и сложить их, Ада не даст. В Аде можно объявлять новые целочисленные типы данных с ограничениями вроде диапазонов возможных значений.
Это не Python. Но его духовный наследник, как впрочем и Ады и еще с десятка других ЯП.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
type
  # distinct означает, что мы отвергаем совместимость нашего нового типа с базовым
  # поэтому нам придется заново переопределять операторы для него
  minutes = distinct range[0..59] 
  hours = distinct range[0..23]
 
proc `$`(x: minutes):string = "$1 minutes" % $x.int
proc `$`(x: hours):string = "$1 hours" % $x.int
 
# переопределения сложения  
proc `+`(x,y: minutes):minutes=
    return minutes(int(x) + int(y))
 
proc `+`(x,y: hours):hours= 
    return hours(int(x) + int(y))  
  
# it's OK
echo 59.minutes 
echo 23.hours 
# it's bad
echo 60.minutes     # Ошибка при компиляции:Error: 60 can't be converted to minutes
echo 24.hours      # Ошибка при компиляции:Error: 24 can't be converted to hours
echo 58.minutes + 1.minutes       # it's OK
echo(59.minutes + 1.hours)       # Ошибка при компиляции: Error: type mismatch: got <minutes, hours>
echo(1.minutes + 1)              # Ошибка при компиляции: Error: type mismatch: got <minutes, hours>
echo 59.minutes + 1.minutes      # Ошибка в runtime: Error: unhandled exception: value out of range: 60 [RangeError]
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
18.12.2019, 10:33
Garry Galler, кстати, о единцах измерения. Кульная штука ведь для всякой физики. Может, добрые люди уже написали что-то такое, нормально (а не на коленке)?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
18.12.2019, 14:35
Цитата Сообщение от dondublon Посмотреть сообщение
Может, добрые люди уже написали что-то такое
Ну что-то подобное есть - measurement - для небольшого числа физических юнитов:Energy, Speed, Temperature,Time,Volume,Weight. Но сам пока не пользовался.
Кстати, реализовано похожим образом, что и в моем примере:
Python
1
2
3
4
5
6
7
8
9
10
def __add__(self, other):
        if isinstance(other, self.__class__):
            return self.__class__(
                default_unit=self._default_unit,
                **{self.STANDARD_UNIT: (self.standard + other.standard)}
            )
        else:
            raise TypeError(
                "%(class)s must be added with %(class)s" % {"class": pretty_name(self)}
            )
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
21.12.2019, 07:32  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Понимаете, питон изначально сделан с duck typing. Если вам по каким-то причинам это не нравится или не подходит - не используйте его. Не надо пытаться его переделать. Есть куча языков со строгой статичной типизацией, в том числе мейнстримовые.
Вроде бы читал, что разработчики хотели сделать статическую типизацию, но не сошлись во мнениях, как это нужно реализовать и отдали решение этой задачи пользователям. Таким образом возможно в Pypi есть несколько вариантов. Кто то их искал, испытывал?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
21.12.2019, 07:59
Цитата Сообщение от supmener Посмотреть сообщение
Таким образом возможно в Pypi есть несколько вариантов. Кто то их искал, испытывал?
В теме уже четыре раза сказали про type hints. В стандартной библиотеке есть модуль typing. Для статического анализа — [urlhttp://mypy-lang.org/]mypy[/url].

Ты уже пробовал эти инструменты? Чем не подошли?
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
21.12.2019, 10:51  [ТС]
Нет не пробовал, потому что не прошел пока книгу по основам Python, которую изучаю.

https://pypi.org/project/enforce/

https://pypi.org/project/enforce-typing/

https://pypi.org/project/typeguard/

https://pypi.org/project/typeshed/

https://pypi.org/project/pytype/

https://pypi.org/project/pytypes/

Добавлено через 12 минут
https://pypi.org/project/typical/
Для истории
https://pypi.org/project/GooseTypes/
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
23.01.2021, 20:53  [ТС]
Нормально ли получается работать с полиморфизмом на Пайтоне при динамической типизации?
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
14.02.2021, 09:18  [ТС]
Вот так можно.
Python
1
2
3
a = int(7)
b = str('8')
print(a + b) # сложения не произойдет
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
14.02.2021, 09:38
Цитата Сообщение от supmener Посмотреть сообщение
Вот так можно.
можно что? это не дактайпинг
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
14.02.2021, 10:08  [ТС]
Сделать статическую или строгую типизацию (пока что не разобрался, чем эти понятия отличаются друг от друга).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.02.2021, 10:08
Помогаю со студенческими работами здесь

вопрос жизни и смерти!!
Помогите с заданиями, мне очень срочно нужно!!! я боюсь меня выгонят из универа((((( ПОЖАЛУЙСТА ПРОШУ ВАС ПОМОГИТЕ!!(((( я написал...

Вопрос жизни и смерти
Дали задание в универе. В Delphi разбираюсь не очень. Прошу помощи как можно скорее. Задать любым изместным пользователю способом...

Вопрос жизни и смерти..
Парни помогите кто хорошо знает С++ просто если я к понидельнику не сдам ету програму мне прийдет писец... Вот собственно задание: ...

Файлы.(Вопрос жизни и смерти)
Создать файл, где каждой компонентой будет массив из N чисел. Определить минимальное значение в каждой компоненте, записав их в другой...

СРОЧНО!!! вопрос жизни и смерти !
ПОМОГИТЕ ПОЖАЛУЙСТА РЕШИТЬ ЗАДАЧУ. Задача Считать из текстового файла информацию в массив строк.Отобразить на экран.Удалить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru