Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30

Сравнение типов с классами из typing

24.10.2021, 20:47. Показов 1930. Ответов 13

Студворк — интернет-сервис помощи студентам
Python 3.9

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
import types
from typing import Union, Any, Optional, Mapping, Sequence, _UnionGenericAlias
 
 
def is_seq(obj: Sequence[object], args):
    return all([isinstance_ex(item, args[0]) for item in obj])
 
 
def is_map(obj: Mapping[object, object], args):
    return all([isinstance_ex(key, args[0]) and isinstance_ex(value, args[1])
                for key, value in obj.items()])
 
 
def is_union(obj: Union, args):
    return any([isinstance(obj, arg) for arg in args])
 
 
def isinstance_ex(obj, type_):
 
   """ оригинальная isinstance()  не поддерживает работу с GenericAlias и прочей мета фигней"""
 
    if type(type_) is types.GenericAlias:
        origin, args = type_.__origin__, type_.__args__
        if isinstance(obj, origin):
            if isinstance(obj, Sequence):  # is list, tuple
                return is_seq(obj, args)
            elif isinstance(obj, Mapping):  # is dict
                return is_map(obj, args)
        return False
    elif type(type_) is _UnionGenericAlias:  # is Union, Optional
        origin, args = type_.__origin__, type_.__args__
        return is_union(obj, args)
    elif type_ is Any:
        return True
    else:
        return isinstance(obj, type_)
 
 
print(isinstance_ex([{"a": 10, "b": 1.6}, {20: 10, "b": 'c'}],
                    list[dict[Union[str, int], Any]]))
Кто-то может сказать можно ли как то сделать проще/лучше? Может я еще какие-то случаи забыл учесть?

Добавлено через 4 минуты
Поправка "Сравнение типов объектов с классами из typing"
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.10.2021, 20:47
Ответы с готовыми решениями:

Изменить код с классами и произвести сравнение
Задача: Класс «Люди» Поля: имя, возраст, социальная группа (студент, работающий и т.д.) и т.д. Для поля «социальная группа»...

Сравнение типов
есть функция: void equalSep(char* str) { // пытаюсь сравнить str и "." или любой другой символ } как мне сделать...

Сравнение типов
Не могу разобраться с механизмом сравнения разных типов данных. Например почему число всегда больше строки 2 > "text" и...

13
 Аватар для Vigi
641 / 481 / 179
Регистрация: 28.05.2012
Сообщений: 1,419
25.10.2021, 04:25
python 3.10 - тайпинг упрощён
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.10.2021, 14:07  [ТС]
Vigi, В каком плане упрощен? Что конкретно Вы имеете ввиду?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
26.10.2021, 20:29
Avazart, не смог уловить предназначения кода, есть пара предположений, но предпочитаю точно узнать - что вы хотите сделать и зачем? Если про мап или сиквенс я могу еще придумать что-то, то вот про юнион...
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.10.2021, 20:59  [ТС]
Welemir1,
Что бы иметь возможность проверять соответствие объекта определенному типу:

Python
1
2
3
4
5
data = [{"a": 10, "b": 1.6}, {20: 10, "b": 'c'}]
 
data_type_template =  list[dict[Union[str, int], Any]]
 
isinstance_ex(data,  data_type_template)
Допустим мы хотим загрузить данные из файла json или получить их по сети и проверить что данные действительно нужного типа.

Да я знаю есть dataclasses есть pydantic есть еще что наверное.
Но хотелось бы понять как сварганить свой велосипед с турбо двигателем.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
26.10.2021, 22:57
Цитата Сообщение от Avazart Посмотреть сообщение
Допустим мы хотим загрузить данные из файла json или получить их по сети и проверить что данные действительно нужного типа.
https://github.com/Julian/jsonschema

.
Цитата Сообщение от Avazart Посмотреть сообщение
свой велосипед с турбо двигателем
Если задача только для JSON, то этот велосипед уже написали... Можно позаимствовать идеи там...
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
27.10.2021, 07:32
Avazart, к оратору выше добавлю - я питон 3.10 еще не ковырял, но вроде по описаниям паттерн-матчинг как раз об этом - проверить тип и состав данных и предпринять какие то действия, в том числе выдернуть из жсона что-то. Я бы туда посмотрел.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.10.2021, 12:23  [ТС]
Блин Вы читать умеете? Я же написал что знаю есть библиотеки.

А если не только json ?

Вы isinstance() в коде своем используете? Не ужели никого не удивляет что он не поддерживает дженерики?

Добавлено через 2 минуты
Цитата Сообщение от Welemir1 Посмотреть сообщение
но вроде по описаниям паттерн-матчинг как раз об этом - проверить тип и состав данных и предпринять какие то действия,
Туда это куда? Пример кода?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
27.10.2021, 12:27
Цитата Сообщение от Avazart Посмотреть сообщение
Не ужели никого не удивляет что он не поддерживает дженерики?
нет. тип который придет уже будет конкретный, не юнион из строки или инта, а точно инт или точно строка

Цитата Сообщение от Avazart Посмотреть сообщение
Туда это куда?
на паттерн-матчинг

Цитата Сообщение от Avazart Посмотреть сообщение
Пример кода?
будет, когда до него доберусь, написал же -еще не смотрел подробно.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.10.2021, 12:28  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
на паттерн-матчинг
И куда его лепить тут? Примеры с ним тоже используют isinstance()
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.10.2021, 16:19
Цитата Сообщение от Avazart Посмотреть сообщение
Блин Вы читать умеете?
Не надо так нервничать. Я же тоже написал "Если задача только для JSON"... Тем более, что на вопрос "а зачем все это", ответом было "например, проверить JSON".
Так что читать я умею. Учился знаете ли в школе... Неожиданно.

И далее: можно открыть исходный код указанной библиотеки и посмотреть как люди делают.

Добавлено через 9 минут
P.S. И потом для глобальной проверки всего кода есть mypy.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.10.2021, 17:14  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Я же тоже написал "Если задача только для JSON
Я сразу написал, что - нет. Там четко сказано "например". Может быть json может быть какой нибудь ini это не важно.

Так что нет все же читать в школе не научили.

Добавлено через 1 минуту
Цитата Сообщение от Garry Galler Посмотреть сообщение
P.S. И потом для глобальной проверки всего кода есть mypy.
И блин чем он поможет? Когда данные приходят из сети или из файла?
mypy проверяет статически и то с проблемами. А динамически нужно "ручками".
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.10.2021, 18:46
Цитата Сообщение от Avazart Посмотреть сообщение
mypy проверяет статически и то с проблемами. А динамически нужно "ручками".
Не понимаю в чем проблема посмотреть как он это вообще делает.... Его, кстати, Гвидо писал... не последний чел в Python.
Ну не хочешь как хочешь. Я же насильно не заставляю. Просто предложил... А ты сразу же сраться. Некультурно.


Кстати, Union, isinstance вполне поддерживает:

Python
1
2
3
print(isinstance("", int | str))
print(isinstance(1, int | str))
print(isinstance(int | str, types.UnionType))
Цитата Сообщение от Avazart Посмотреть сообщение
Так что нет все же читать в школе не научили.
И как ж я все-таки читаю? Ладно - так и быть, глупую реплику пропущу мимо ушей.

---------------------------------------------------------------------

Цитата Сообщение от Welemir1 Посмотреть сообщение
проверить тип и состав данных и предпринять какие то действия
Проверить структуру данных - да, вполне годится...
Python
1
2
3
4
5
6
7
8
9
10
data = [{"a": 10, "b": 1.6}, {20: 10, "b": 'c'}, {"others":1}]
 
for d in data:
    match d:
      case {"a":a, **kw}:
          print(f'словарь {{a:{a}, **{kw}}}')
      case {20:x, **kw}:
          print(f'словарь {{20:{x}, **{kw}}}')
      case _:
          print("что-то другое")
А вот типы сам по себе matсh не проверяет. То есть таки да - там ту же isinstance использовать нужно.
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.10.2021, 20:55  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Кстати, Union, isinstance вполне поддерживает:
Попробуйте list[int]

Цитата Сообщение от Garry Galler Посмотреть сообщение
Проверить структуру данных - да, вполне годится...
Ничего что код не равноценный от слова совсем? Там список диктов если не заметили

Добавлено через 33 секунды
Цитата Сообщение от Garry Galler Посмотреть сообщение
А вот типы сам по себе matсh не проверяет.
Иными словами совсем не к месту. О чем я писал с самого начала.

Добавлено через 38 секунд
Цитата Сообщение от Garry Galler Посмотреть сообщение
То есть таки да - там ту же isinstance использовать нужно.
Который не работает с дженериками ... о чем я писал в первом посте.

Добавлено через 2 минуты
Цитата Сообщение от Garry Galler Посмотреть сообщение
Не понимаю в чем проблема посмотреть как он это вообще делает.... Его, кстати, Гвидо писал... не последний чел в Python.
Ну не хочешь как хочешь. Я же насильно не заставляю. Просто предложил... А ты сразу же сраться. Некультурно.
На что смотреть? С таким же успехом можно предлагать сгонять на Марс у марсиан спросить )))

Добавлено через 5 минут
Еще раз переформулирую может на третий раз таки дойдет:
У нас есть объект "X" и тип(возможно дженерик) "Y" как нам не строя предположений о том чем они являются проверить является ли "X" типом "Y"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.10.2021, 20:55
Помогаю со студенческими работами здесь

Сравнение типов
Здравствуйте. Уже час гуглю и ломаю голову над проблемой: нужно сравнить типы, именно типы, на равенство. Суть такова: static public...

Сравнение типов
Здравствуйте. ... $(".combobox_value").click(function () { ... ...

Сравнение обобщённых типов
Доброго времени суток. Недавно получил задание: реализовать неубывающую очередь с приоритетами. Реализовал для приоритета (ключа) типа int,...

Сравнение анонимных типов
есть метод контроллера, который возвращает JsonResult public JsonResult SomeMethod() { Boolean isExist =...

Сравнение ссылочных типов
первый случай понятен , без явного приведения мы сравниваем одинаковое значения по разным ссылкам.(будет true) второй случай тоже...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
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
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru