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

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

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

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

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

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

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

125
Эксперт .NET
 Аватар для Usaga
14314 / 9400 / 1355
Регистрация: 21.01.2016
Сообщений: 35,450
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 / 9400 / 1355
Регистрация: 21.01.2016
Сообщений: 35,450
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 / 9400 / 1355
Регистрация: 21.01.2016
Сообщений: 35,450
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 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru