Какие целочисленные типы данных (например, знаковые, беззнаковые, байт, short) представлены в стандартной библиотеке Python?

Как можно в Python реализовать ограничение на целочисленную переменную без использования внешних библиотек и буфера, если данные берутся из базы данных и сохраняются туда? Например, если в базе данных используется тип поля byte[0..255] or byte[-128...+128], как можно обеспечить соответствие переменной этим ограничениям в Python без дополнительных проверок?
  • 24 января 2024 г. 6:39
Ответы на вопрос 3
В Python все числа представлены как объекты, и Python предоставляет один целочисленный тип - `int`. В отличие от многих других языков, в Python 3 тип `int` не имеет фиксированного размера и может быть сколько угодно большим (или маленьким), по крайней мере до тех пор, пока есть доступная память. То есть в Python 3 нет отдельных типов целочисленных данных по размеру, как `byte`, `short`, `int` и `long` в Java или C. Это означает, что в Python не приходится беспокоиться о переполнениях переменных целого типа из-за ограничений размера.

Для представления байтов в Python есть тип `bytes`, который представляет неизменяемый массив байтов, и `bytearray`, который представляет изменяемый массив байтов. Однако это не примитивные целочисленные типы, а последовательности байтов.

Чтобы реализовать ограничение на целочисленную переменную в Python без использования внешних библиотек, можно создать специальный класс, который будет управлять значением и ограничивать его в рамках заданных границ. Но следует отметить, что такой подход всё равно включает в себя проверку границ при присвоении нового значения объекту данного класса. Пример такого класса:

```python
class ConstrainedInt:
    def __init__(self, value=0, min_value=None, max_value=None):
        self.min_value = min_value
        self.max_value = max_value
        self._value = self._validate(value)
        
    def _validate(self, value):
        if not isinstance(value, int):
            raise TypeError('Value must be an integer')
        if (self.min_value is not None and value < self.min_value) or \
           (self.max_value is not None and value > self.max_value):
            raise ValueError(f'Value must be between {self.min_value} and {self.max_value}')
        return value
    
    @property
    def value(self):
        return self._value
    
    @value.setter
    def value(self, value):
        self._value = self._validate(value)
    
    def __repr__(self):
        return f"ConstrainedInt({self._value})"

# Использование
byte = ConstrainedInt(0, 0, 255)  # Только значения от 0 до 255
signed_byte = ConstrainedInt(0, -128, 127)  # Только значения от -128 до 127
```

Данный класс использует геттеры и сеттеры для управления значением переменной и проверяет на соответствие заданным ограничениям. При попытке задать значение вне разрешенного диапазона будет выброшено исключение `ValueError`.

Это означает, что для того чтобы следовать ограничениям, выдвигаемым типами данных базы данных, вам всё равно нужно будет проводить какую-то форму проверки в вашем Python коде. Невозможно создать переменную так, чтобы она "по умолчанию" ограничивалась определенными границами без какой-либо проверки или механизма ограничения, такого как вышеописанный пример класса.
Есть ли в питоне в стандартной библиотеке под типы целочисленные(знаковый\безнаковый, byte, short)?

Нет.
Вопрос как без бубна и доп.библиотек реализовать ограничение на целочисленную переменную,
данные берутся из БД и тудаже сохраняются, в БД к примеру стоит тип поля byte[0..255] or byte[-128...+128] как кроме проверок обеспечить заданные параметры для переменной в питоне, что бы она не выходила за рамки заданного типа?

- Использовать библиотеку (рекомендую), например Pydantic (используется в самом быстром (из популярных) веб-фреймворке FastAPI по дефолту).
- Класс (с инкапсуляцией такого действия).
- Простые проверки.
На то он и динамический язык ... 
Хочется быстро и с типизацией, то это Go
Похожие вопросы