Some simple code to show the differences between using namedtuple from the collections module and NamedTuple from the typing module. Extra points for using type hinting.
Using namedtuple from the collections module:
>>> from platforms_namedtuple_35 import *
>>> system_1 = RHEL7
>>> system_2 = RHEL5
>>> print(system_1)
OperatingSystem(distribution_id='Maipo', distribution_name='Red Hat Enterprise Linux Server', distribution_version='7.3', kernel_name='3.10.0-514
.el7', lsb_dist_id=' RedHatEnterpriseServer', manufacturer='Red Hat', operating_system='RedHat', os_family='Linux')
>>> print(system_2)
OperatingSystem(distribution_id='Tikanga', distribution_name='Red Hat Enterprise Linux Server', distribution_version='5.11', kernel_name='2.6.18-
398.el5', lsb_dist_id=' RedHatEnterpriseServer', manufacturer='Red Hat', operating_system='RedHat', os_family='Linux')
>>> print(system_1.kernel_name)
3.10.0-514.el7
>>> print(system_2.kernel_name)
2.6.18-398.el5
>>> print(system_1.to_json())
{
"distribution_id": "Maipo",
"distribution_name": "Red Hat Enterprise Linux Server",
"distribution_version": "7.3",
"kernel_name": "3.10.0-514.el7",
"lsb_dist_id": " RedHatEnterpriseServer",
"manufacturer": "Red Hat",
"operating_system": "RedHat",
"os_family": "Linux"
}
Using typing.NamedTuple module (requires Python >= 3.6.1 to take advantage of default values):
>>> from platforms_namedtuple_36 import *
>>> system_1 = RHEL7()
>>> system_2 = RHEL5()
>>> print(system_1)
<OperatingSystem: Red Hat Enterprise Linux Server release 7.3 (Maipo)>
>>> print(system_2)
<OperatingSystem: Red Hat Enterprise Linux Server release 5.11 (Tikanga)>
>>> print(system_1.kernel_name)
3.10.0-514.el7
>>> print(system_2.kernel_name)
2.6.18-398.el5
>>> print(system_1.to_json())
{
"distribution_id": "Maipo",
"distribution_name": "Red Hat Enterprise Linux Server",
"distribution_version": "7.3",
"kernel_name": "3.10.0-514.el7",
"lsb_dist_id": "RedHatEnterpriseServer",
"manufacturer": "Red Hat",
"operating_system": "RedHat",
"os_family": "Linux"
}