1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
#
# Copyright 2022 Ettus Research, a National Instruments Brand
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
"""
Provides class CompatNumber, a convenience class for handling compat numbers.
"""
class CompatNumber:
"""
Utility class for handling compat numbers.
CompatNumber instances can be generated from floats, from string
representations of floats, from two integers, and from tuples (when
instantiating from tuples, only the first two elements are used and are
interpreted as major, minor. The third element is used as a build
timestamp, and is ignored for compat number comparisons).
These are identical:
>>> cn = CompatNumber(4, 3)
>>> cn = CompatNumber(4.3)
>>> cn = CompatNumber("4.3")
>>> cn = CompatNumber((4, 3, 1234)) # Only first two elements are used!
>>> cn = CompatNumber((4, 3, 5678))
Compat numbers can be compared using regular operators. All of the following
statements are True:
>>> cn < CompatNumber(4, 5)
>>> cn == 4.3
>>> cn >= 3
"""
def __init__(self, major, minor=None):
if minor is None and isinstance(major, tuple):
self.major = major[0]
self.minor = major[1]
elif minor is None:
major, minor = str(float(major)).split('.', 1)
self.major, self.minor = int(major), int(minor)
else:
if not isinstance(major, int) or not isinstance(minor, int):
raise ValueError("Invalid major/minor values!")
self.major = major
self.minor = minor
def __str__(self):
return f"{self.major}.{self.minor}"
def __repr__(self):
return f"CompatNumber({self.major}, {self.minor})"
def __eq__(self, rhs):
if not isinstance(rhs, CompatNumber):
return self == CompatNumber(rhs)
return self.major == rhs.major and self.minor == rhs.minor
def __gt__(self, rhs):
if not isinstance(rhs, CompatNumber):
return self > CompatNumber(rhs)
return self.major > rhs.major or \
(self.major == rhs.major and self.minor > rhs.minor)
def __lt__(self, rhs):
if not isinstance(rhs, CompatNumber):
return self < CompatNumber(rhs)
return self.major < rhs.major or \
(self.major == rhs.major and self.minor < rhs.minor)
def __ge__(self, rhs):
return self == rhs or self > rhs
def __le__(self, rhs):
return self == rhs or self < rhs
if __name__ == "__main__":
c = CompatNumber(4.3)
d = CompatNumber(4.4)
e = CompatNumber(5.1)
print(c)
print(c == d)
print(c != 4.3)
print(c == 4.4)
print(e > d)
|