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 и ошибками времени выполнения и почему оно не одинаково в разных системах?
Деление между двумя числами — это целое число в Python2 и число с плавающей запятой в Python3. Это может быть проблемой.
Да, но я использую Python 3, и он все еще работает, хотя PyCharm отмечает ошибку.
Вы уверены, что используете Python 3…?!
Абсолютно. версия 3.11.3
@RobinAndrews Как ты это запускаешь? Ваш Pycharm может быть настроен для запуска python3, но при запуске его вручную в терминале может использоваться другая версия. Особенно в Linux/Mac, поскольку python2 является системным интерпретатором по умолчанию.
В терминале тоже работает нормально. С версии 3.11.3
Пожалуйста, добавьте import sys; print(sys.version)
к коду…
В Python 3.11 randint
принимает целое число float
; этого нет в Python 3.12. (Я не знаю, какое конкретное скрытое изменение за это отвечает.)
Предупреждения/ошибки, которые выдает 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
:
x/y
не было точным целочисленным значением (например, 0.3/0.1
математически равно 3, но в арифметике с плавающей запятой немного меньше 3).
Пожалуйста, предоставьте минимально воспроизводимый пример . random.randint ожидает два параметра, поэтому предоставленная информация не имеет смысла сама по себе.