PyCharm предупреждает: «Ожидаемый тип 'int', получено 'float'» для случайного.randint, но код все равно иногда запускается

PyCharm (Python версии 3.11.3 для Windows) помечает Expected type 'int', got 'float' instead, где я использую random.randint(x/y, 10) (где x/y будет, скажем, 5.0), что имеет смысл. Однако код все еще работает.

Кто-то другой, использующий другую IDE, попытался запустить код и TypeError предотвратил его запуск. Я не знаю, на какой системе/версии это было сделано, но для меня это не имеет смысла.

Для минимально жизнеспособной программы:

import random

x = 10
y = 2

print(random.randint(x/y, 10)

Почему существует несоответствие между предупреждением PyCharm и ошибками времени выполнения и почему оно не одинаково в разных системах?

Пожалуйста, предоставьте минимально воспроизводимый пример . random.randint ожидает два параметра, поэтому предоставленная информация не имеет смысла сама по себе.

deceze 15.04.2024 16:08

Деление между двумя числами — это целое число в Python2 и число с плавающей запятой в Python3. Это может быть проблемой.

Ted Klein Bergman 15.04.2024 16:12

Да, но я использую Python 3, и он все еще работает, хотя PyCharm отмечает ошибку.

Robin Andrews 15.04.2024 16:13

Вы уверены, что используете Python 3…?!

deceze 15.04.2024 16:14

Абсолютно. версия 3.11.3

Robin Andrews 15.04.2024 16:14

@RobinAndrews Как ты это запускаешь? Ваш Pycharm может быть настроен для запуска python3, но при запуске его вручную в терминале может использоваться другая версия. Особенно в Linux/Mac, поскольку python2 является системным интерпретатором по умолчанию.

Ted Klein Bergman 15.04.2024 16:15

В терминале тоже работает нормально. С версии 3.11.3

Robin Andrews 15.04.2024 16:16

Пожалуйста, добавьте import sys; print(sys.version) к коду…

deceze 15.04.2024 16:17

В Python 3.11 randint принимает целое число float; этого нет в Python 3.12. (Я не знаю, какое конкретное скрытое изменение за это отвечает.)

chepner 15.04.2024 16:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
9
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предупреждения/ошибки, которые выдает PyCharm, являются результатом статического анализа, основанного на подсказках типов, и в принципе могут отличаться от поведения во время выполнения.

В случае с random.randint до Python 3.12 он принимал целочисленные аргументы float и неявно преобразовывал их в int.

Начиная с Python 3.12, аргументы float больше не допускаются вообще, см. https://docs.python.org/3/library/random.html#random.randrange (randint делегаты randrange).

Итак, две вещи могли вызвать TypeError:

  • Версия Python была ≥3.12.
  • x/y не было точным целочисленным значением (например, 0.3/0.1 математически равно 3, но в арифметике с плавающей запятой немного меньше 3).

Другие вопросы по теме

Необработанная ошибка времени выполнения TypeError: невозможно прочитать свойства null (чтение «по умолчанию») в моем next.js
Ошибка типа: невозможно прочитать свойства неопределенного значения (чтение «карты») в реакции разработки
Использование pysnmp-lextudio next() с генератором getCmd() приводит к TypeError: объект «кортеж» не является итератором
Как проанализировать столбец с помощью pandas, содержащий «-» [TypeError]
Python – почему мой код возвращает TypeError
HASS — обычный метод определения времени восхода и захода солнца перестал работать — как решить?
Angular внезапно перестал работать в dev, prod и local без изменений, успешно компилируется
Почему импорт ES6 не работает в простых файлах js
Устаревший код Aiogram: TypeError: дескриптор «__pydantic_extra__» для объектов «BaseModel» не применяется к объекту «KeyboardButton»
Ошибка реакции — введите «строка | string[]' не может быть присвоен типу 'string[]'