Форум программистов, компьютерный форум, киберфорум
Python: IDE, инструментарий
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387

PyCharm (VS Code), Type hints, оператор сравнения (if)

13.02.2024, 15:07. Показов 877. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Заметил интересный (на мой взгляд) момент.

Если использовать type hints, то при попытке присвоить значение несоответствующего типа IDE выдает предупреждение.
Если создать список, и указать тип значений которые в нем должны содержаться, то при добавлении значения другого типа, также получаем предупреждение.

А вот при использовании оператора сравнения, никаких предупреждений не появляется.
Python
1
2
3
4
5
a: int = 5
b: str = "abc"
 
if a == b:
    print('a == b')
Кто-нибудь знает как их (предупреждения) включить.
В настройках PyCharm я не нашел.

Проверил в VS Code. Установил несколько разных линтеров (Pylint, MyPy, Sonarlint) и ни один также не выдал ни одного предупреждения, что мы сравниваем "литры с километрами".

Есть возможность каким-либо образом добавить данный функционал?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.02.2024, 15:07
Ответы с готовыми решениями:

Оператор сравнения выдает ошибку Type mismatch
Есть три ячейки в столбце. Содержат символы: -, 0, - . Имеют тип string Условие If ((Cells(NumR, NumC).Value = 0) And Not...

Декоратор, изменяющий возвращаемое значение + type hints
Имеется декоратор с одним параметром. Декоратор convert_return преобразовывает результат декорируемой функции с помощью другой функции. ...

Сообщение PyCharm - Unexpected type(s)
- Здравствуйте, Всем Самого Наилучшего! Подскажите пожалуйста, в Python 3.11 имею вот такой простейший код: class Pict: # ..... ...

8
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
13.02.2024, 15:18
Цитата Сообщение от anton78spb Посмотреть сообщение
ни один также не выдал ни одного предупреждения, что мы сравниваем "литры с километрами".
А зачем предупреждать? Может тебе и надо сравнивать литры с километрами.
0
12 / 11 / 3
Регистрация: 30.04.2019
Сообщений: 66
26.04.2024, 09:48
Цитата Сообщение от anton78spb Посмотреть сообщение
А вот при использовании оператора сравнения, никаких предупреждений не появляется.
Оператор сравнения у разных типов может быть перегружен и сравнивать разные типы вполне оказывается можно.
Поэтому вряд ли показ таких предупреждений уместен.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
26.04.2024, 16:31
Я тоже не вижу проблемы. Есть перегрузка оператора == для типов int и str - ну и ок. Лучше контролируйте типы входных параметров, хотя бы теми же аннотациями.

Python
1
2
3
4
5
6
7
8
9
10
def func(arg1: int, arg2: int):
    if arg1 == arg2:
        print('arg1 == arg2')
    else:
        print('false')
 
 
a: int = 5
b: str = "abc"
func(a, b)
Добавлено через 57 секунд
Более хардкорный способ:
Python
1
2
3
4
5
6
7
def func(arg1: int, arg2: int):
    assert isinstance(arg1, int)
    assert isinstance(arg2, int)
    if arg1 == arg2:
        print('arg1 == arg2')
    else:
        print('false')
0
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
27.04.2024, 09:16  [ТС]
iSmokeJC, jnllll, Рыжий Лис,
Проблема в том, что у меня был примерно такой код.
Python
1
2
3
4
5
6
7
8
9
class Foo:
    def __init__(self, value: int):
        self.value = value
        
f: Foo = Foo(5)
number: int = 5
 
if f.value == number:
    print("Ok.")
Но в if-e я допустил опечатку и не добавил .value к объекту класса.
Т.е. сделал так:
Python
1
if f == number:
Логика поломалась, а предупреждений не было.
Ошибку я нашел быстро, но "осадок остался".

Т.е. с одной стороны я понимал, что "оно" сравнивает два объекта, один типа int, а другой типа Foo, и это разные объекты. Вроде все "по честному".

Но с другой, вроде я специально указываю типы, чтобы статический анализ работал. Причем int, хоть и является объектом, но по сути это "примитивный" тип, и хотелось бы увидеть хоть какое-то предупреждение. Что-то типа "вы уверены что хотите сравнить число с объектом".
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
27.04.2024, 14:22
С такими запросами вам в rust (без обид).

Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Foo {
    value: i32,
}
 
fn main() {
    let f = Foo {
        value: 5,
    };
    let number = 5;
    if f.value == number {  // ok
        println!("Ok.");
    }
    if f == number {
        println!("Ok.");
    }
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
error[E0369]: binary operation `==` cannot be applied to type `Foo`
  --> src/main.rs:13:10
   |
13 |     if f == number {
   |        - ^^ ------ i32
   |        |
   |        Foo
   |
note: an implementation of `PartialEq<i32>` might be missing for `Foo`
  --> src/main.rs:1:1
   |
1  | struct Foo {
   | ^^^^^^^^^^ must implement `PartialEq<i32>`
1
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
28.04.2024, 00:37
Цитата Сообщение от anton78spb Посмотреть сообщение
вроде я специально указываю типы, чтобы статический анализ работал
Так эти аннотации типов в питоне им никак не используются, это чисто для читателя программы.
Цитата из документации:
<Среда выполнения Python не использует аннотации к функциям и типам переменных. Они могут использоваться сторонними инструментами, такими как средства проверки типов, IDE, компоновщики и т.д.>
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
28.04.2024, 06:25
Чтобы быть совсем честным, аннотации всё же доступны в рантайме __annotations__ и некоторые библиотеки даже полагаются на их наличие. Может быть, тот же pydantic.
0
12 / 11 / 3
Регистрация: 30.04.2019
Сообщений: 66
30.04.2024, 08:27
Цитата Сообщение от anton78spb Посмотреть сообщение
Но с другой, вроде я специально указываю типы,
Всё же Python язык с динамической типизацией, и тайпхинтинг лишь вспомогательный инструмент. Он призван по большому счёту выразить типы, которые ожидаются во входных и выходных данных (будь то функция или любой другой блок или модуль, который может быть скомпилирован и инструменты проверки типов не смогут определить внутреннюю логику).
Вот сигнатуры методов сравнения для типов int и object:

Python
1
2
3
    def __eq__(self, *args, **kwargs): # real signature unknown
        """ Return self==value. """
        pass
Здесь нет никаких указаний на тип входных данных. То есть, даже если в IDEшках и реализована проверка операции сравнения, то из-за этого, здесь нет никаких оснований показывать предупреждение.
Если требуется, чтобы проверка работала, то нужно наследоваться и переписывать методы. По другому никак.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.04.2024, 08:27
Помогаю со студенческими работами здесь

Process finished with exit code 1073741845 - PyCharm Pandas
Всем привет. После того как перешел с Python 3.7 на Python 3.4, а потом на Python 3.7. В Pycharm начала вылетать ошибка:&quot;Process...

Pycharm выдаёт ошибку, если пишу оператор выбора if
Начал работать на питоне в Pycharm. Редактор выдаёт ошибку, если пишу оператор выбора if, что делать?

Оператор сравнения
Здравствуйте. Интересует как сделать что бы первый if отрабатывал только если обе переменные пустые &lt;?php if (empty($_POST and...

Оператор сравнения
Надо написать программу, которая переводит фунты в стоуны, используя класс. Класс содержит перегруженные операторы мат. операций (сложение,...

Оператор сравнения
Возник вот такой вопрос, может кто знает в чем причина, почему выполняется такое условие? $a = '0'; $b = '000000000000000000'; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
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
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru