Я перехожу с 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
@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