Могу ли я объявить переменную, строго типизированную как целое число, в Python, как я делаю это в Java?

Я перехожу с Java на Python и хотел бы знать, есть ли у меня возможность сделать переменную целочисленной и никогда не пытаться преобразовать себя во что-то другое. .

# A method that return a floating point number
def afloatvalue():
    return 20.1

# Here is a variable i I would like to be an integer
i = 15

# But of course, this assignment changes it to a floating point number.
i = afloatvalue()

print(i)

Вывод: 20.1 (обычный)
Но я бы хотел, чтобы i оставалось абсолютно целым числом в любом месте программы (например, в Java), так что:

i = afloatvalue()

Приведет к 20.

Возможно ли использовать какое-то ключевое слово при его определении?

i : int = 15

не дает этой гарантии.

tl;dr: не совсем, но см. mypy.readthedocs.io/en/stable   —  person Marc Le Bihan    schedule 14.06.2021

Python динамически типизирован (т. е. типы переменных определяются во время выполнения), поэтому нет.   —  person Marc Le Bihan    schedule 14.06.2021

Сами переменные не имеют типа; значения имеют типы, и имена могут относиться к значениям любого типа. Однако тип hint может быть указан как аннотация для указания сторонним инструментам или как документация того, что намерение состоит в том, чтобы имя ссылалось на значение конкретный тип. Ни при каких обстоятельствах простое присваивание не будет выполнять какое-либо приведение типа или преобразование присваиваемого значения.   —  person Marc Le Bihan    schedule 14.06.2021

В данном конкретном случае я считаю это недостатком, а не особенностью, при которой другие языки молча усекают числа с плавающей запятой без какого-либо видимого синтаксиса, указывающего на это. Я бы не стал подражать этим языкам. Тот факт, что Python потребует от вас явного усечения, — это хорошо.   —  person Marc Le Bihan    schedule 14.06.2021

См. также:  Подпроцесс Python.Popen + ffmpeg прерывает ввод терминала

@chepner Разве это не приводит к проблемам? Как вы можете заставить их быть целыми числами, когда это действительно необходимо и вы используете стороннюю функцию, о которой вы не знаете, но возвращаете числа?   —  person Marc Le Bihan    schedule 14.06.2021

Вы несете ответственность за поддержание правильного типа, потому что не существует единственного правильного преобразования float в int: должно ли 20.1 усекаться, округляться до ближайшего целого числа, всегда округляться в большую сторону или как? Python не может определить это за вас, поэтому не будет пытаться.   —  person Marc Le Bihan    schedule 14.06.2021

При этом встроенные типы int и float знают друг о друге, поэтому такие вещи, как 3 + 3.5, будут работать без явного преобразования. Не потому, что Python выполняет неявное приведение типов, а потому, что 3 + 3.5 эквивалентно int.__add__(3, 3.5), а int.__add__ знает, как создать значение float из int и float.   —  person Marc Le Bihan    schedule 14.06.2021

Переход от статической типизации к динамической — это сложный когнитивный сдвиг. Сначала вы заметите только недостатки динамической типизации, и это покажется глупостью. Потребуется некоторое время, прежде чем вы сможете оценить и усвоить плюсы. Мой совет: постарайтесь умерить свою внутреннюю реакцию на странные практики, которые вы наблюдаете. Поверьте, что они как-то разумны. Иметь веру. Со временем это обретет смысл, и вы начнете замечать недостатки статической типизации, которых раньше не замечали.   —  person Marc Le Bihan    schedule 14.06.2021

Помимо статического и динамического различия, есть также сильное и слабое различие в наборе текста, причем Python находится на сильном конце спектра. Это просто означает, что значения не преобразуются неявно в другие значения: необходимо создать новые значения, даже если механизм для этого скрыт в механизме языка. (Например, любой тип значения может использоваться в условии if, потому что в Python есть хорошо задокументированные средства получения значения правдоподобия из небулевых значений. Ненулевые числа являются истинными, пустые контейнеры — ложными и т. д.)   —  person Marc Le Bihan    schedule 14.06.2021

Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: