Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755

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

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

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

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

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

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

125
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,741
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
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,741
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
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,741
17.12.2019, 09:25
Цитата Сообщение от supmener Посмотреть сообщение
Чтобы зная синтаксис одного языка, не надо было учить синтаксис другого.
А нафига может потребоваться изучение и питона и ады одновременно? И почему именно ада? Почему не мейнстримовые языки?

Добавлено через 25 секунд
Цитата Сообщение от supmener Посмотреть сообщение
- вставлять в каждую процедуру проверки типов всех используемых переменных
Серьёзно, что ли?
0
Эксперт Python
 Аватар для dondublon
4661 / 2080 / 367
Регистрация: 17.03.2012
Сообщений: 10,202
Записей в блоге: 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
5439 / 3860 / 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
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
17.12.2019, 14:22
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
А для ТСа скажу, что в стандартной библиотеке есть datetime
Это да. Но на месте Core Python developers я бы ее немножко переписал :-)
Примерно до такого
times
times.nim
0
Эксперт Python
5439 / 3860 / 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
4661 / 2080 / 367
Регистрация: 17.03.2012
Сообщений: 10,202
Записей в блоге: 6
18.12.2019, 10:33
Garry Galler, кстати, о единцах измерения. Кульная штука ведь для всякой физики. Может, добрые люди уже написали что-то такое, нормально (а не на коленке)?
0
Эксперт Python
5439 / 3860 / 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,696
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru