Python альтернатива для заголовочного файла, содержащего минимальные / максимальные значения типов данных (и проверки пределов) - PullRequest
0 голосов
/ 19 марта 2020

Приветствую, друзья из моего домашнего офиса!

Я реализую скрипт python, который должен проверять, находится ли указанное минимальное / максимальное значение между границами типа данных параметра / сигнала. Входные данные представляют собой электронную таблицу / таблицу с форматом [minValue, maxValue, datatype], например [0, 255, 'uint8']

Поскольку речь идет о среде C, мне нужно проверить пределы uint8, uint16, int32 и float32. Я наткнулся на файл limit.h, в котором все значения определены явно, но я не могу понять, как реализовать его в своем скрипте Python 3.6.8. Моей главной целью было бы сохранить его в чистоте и простоте, без лишней информации, функций, жесткого кодирования.

limit.h

#define INT8MAX 127
#define INT8MIN (-INT8MAX -1)
#define INT16MAX 32767
#define INT16MIN (-INT16MAX -1)
#define INT32MAX 2147483647L
#define INT32MIN (-INT32MAX -1L)

#define UINT8MAX 255
#define UINT8MIN 0
#define UINT16MAX 65535
#define UINT16MIN 0
#define UINT32MAX 4294967295L
#define UINT32MIN 0

#define FLOAT32MAX 3.40282347E+38F
#define FLOAT32MIN -3.40282347E+38F
#define FLOAT64MAX 1.7976931348623157E+308
#define FLOAT64MIN -1.7976931348623157E+308

Каким было бы оптимальное решение этой проблемы? Лучшее, что я мог найти, - это создать словарь и соединить его ключи с вызываемыми функциями, но это означает, что я должен реализовать проверку для каждого типа данных отдельно. (или просто создайте словарь со всеми значениями и ключами, такими как uint8_min , uint8_max , et c)

limit.py

def is_uint8(_min, _max, _dt):
    if _max > 255:
        print("[ERROR] Max value of parameter is incorrect!")
        return 1
    elif _min < 0:
        print("[ERROR] Min value of parameter is incorrect!")
        return -1
    else:
        return 0

_check = {
    'uint8': is_uint8,
    'uint16': is_uint16,
    'uint32': is_uint32,
    'int8': is_int8,
    .
    .
    .
    'float32': is_float32
}

def checkLimits4DataType(_min, _max, _dt):
    [_dtName, _dtSize] = re.split(r"(\d+)", _dt)
    print(_check[_dtName](_min, _max, _dtSize))

Я бы предпочел подобную заголовку структуру для limit.py, со всеми минимальными / максимальными значениями, определенными в верхней части, с как можно меньшим количеством методов check_datatype_limits - обеспечивая максимальную гибкость в отношении его использования. Может быть, определить некоторые классы, которые имеют собственный метод для проверки ограничений?

Заранее спасибо за вашу помощь!

PS Я читал о библиотеке ctypes, но она не содержит все значения / datatype, который мне нужно проверить, плюс он не проверяет переполнения.

1 Ответ

1 голос
/ 20 марта 2020

Самое простое решение, которое я могу придумать, - хранить мин / макс в отображении и иметь только одну реализацию функции check.

TypeRanges = {
    "uint8": (0, 255),
    "int8": (-128, 127),
    .
    .
    .
    "float32": (-3.40282347E+38, 3.40282347E+38)
}

def check_limits(mn, mx, type_name):
    type_min, type_max = TypeRanges[type_name]

    if mx > type_max:
        return 1
    elif mn < type_min:
        return -1
    return 0

И использование:

check_limits(-30, 190, "int8")  # Returns 1
check_limits(-30, 190, "uint8")  # Returns -1
check_limits(-30, 90, "int8")  # Returns 0

Единственное, что вам нужно для жесткого кода, - это минимальное и максимальное значение для каждого типа, но код, который проверяет ограничения, является общим.

...