Patterns for macaddress

Create a range of MAC addresses

# Import `pprint.pprint` and `macaddress.MediaAccessControlAddress`.

>>> from pprint import pprint
>>> from macaddress import MediaAccessControlAddress

# Identify the start and end of the range.

>>> start_mac = MediaAccessControlAddress("a0b1c2d3e4f5")
>>> end_mac = MediaAccessControlAddress("a0b1c2d3e4ff")

# Create a list containing one `MediaAccessControlAddress` object
# for each address in the range.

>>> mac_range = [
...   MediaAccessControlAddress(format(decimal, "x"))
...   for decimal in range(start_mac.decimal, end_mac.decimal + 1)
... ]

# Do something useful with the results, such as returning
# the colon notation of each MAC address in the list.

>>> colons = [
...     mac.to_colon_notation() for mac in mac_range
... ]
>>> pprint(colons)
["a0:b1:c2:d3:e4:f5",
 "a0:b1:c2:d3:e4:f6",
 "a0:b1:c2:d3:e4:f7",
 "a0:b1:c2:d3:e4:f8",
 "a0:b1:c2:d3:e4:f9",
 "a0:b1:c2:d3:e4:fa",
 "a0:b1:c2:d3:e4:fb",
 "a0:b1:c2:d3:e4:fc",
 "a0:b1:c2:d3:e4:fd",
 "a0:b1:c2:d3:e4:fe",
 "a0:b1:c2:d3:e4:ff"]

Map-reduce a list of MAC addresses

# Import `functools.reduce`, `pprint.pprint`, and
# `macaddress.MediaAccessControlAddress`.

>>> from functools import reduce
>>> from pprint import pprint
>>> from macaddress import MediaAccessControlAddress

# Define `transform`, which is our map function.

>>> def transform(mac, attributes):
...     transformed = {}
...     transformed[mac.normalized] = {}
...     for attribute in attributes:
...         transformed[mac.normalized][attribute] = getattr(mac, attribute)
...     return transformed
...

# Define `fold`, which is our reduce function.

>>> def fold(current_mac, next_mac):
...     for key, value in next_mac.items():
...         if key in current_mac:
...             pass
...         else:
...             current_mac[key] = value
...     return current_mac
...

# Define `map_reduce`, which calls `functools.reduce`, `transform`, and `fold`.

>>> def map_reduce(macs, attributes):
...     return reduce(fold, [transform(mac, attributes) for mac in macs])
...

# Identify addresses of interest.

>>> addresses = [
...     "a0:b1:c2:d3:e4:f5",
...     "a0:b1:c2:d3:e4:f6",
...     "a0:b1:c2:d3:e4:f7",
...     "a0:b1:c2:d3:e4:f8",
...     "a0:b1:c2:d3:e4:f9",
...     "a0:b1:c2:d3:e4:fa",
...     "a0:b1:c2:d3:e4:fb",
...     "a0:b1:c2:d3:e4:fc",
...     "a0:b1:c2:d3:e4:fd",
...     "a0:b1:c2:d3:e4:fe",
...     "a0:b1:c2:d3:e4:ff"
... ]

# Create a list containing one `MediaAccessControlAddress` object
# for each address of interest.

>>> macs = [
...     MediaAccessControlAddress(address) for address in addresses
... ]

# Create a list with attributes of interest.

>>> attributes = [
...     "is_unicast",
...     "is_uaa"
... ]

# Call `map_reduce`, passing in the lists of `MediaAccessControlAddress`
# objects and attributes.

>>> mapped_reduced = map_reduce(macs, attributes)
>>> pprint(mapped_reduced)
{"a0b1c2d3e4f5": {"is_uaa": True, "is_unicast": True},
 "a0b1c2d3e4f6": {"is_uaa": True, "is_unicast": True},
 "a0b1c2d3e4f7": {"is_uaa": True, "is_unicast": True},
 "a0b1c2d3e4f8": {"is_uaa": True, "is_unicast": True},
 "a0b1c2d3e4f9": {"is_uaa": True, "is_unicast": True},
 "a0b1c2d3e4fa": {"is_uaa": True, "is_unicast": True},
 "a0b1c2d3e4fb": {"is_uaa": True, "is_unicast": True},
 "a0b1c2d3e4fc": {"is_uaa": True, "is_unicast": True},
 "a0b1c2d3e4fd": {"is_uaa": True, "is_unicast": True},
 "a0b1c2d3e4fe": {"is_uaa": True, "is_unicast": True},
 "a0b1c2d3e4ff": {"is_uaa": True, "is_unicast": True}}

Serialize the attributes of a MAC address

# Import `json.dumps`.

>>> from json import dumps

# Identify the addresses and attributes of interest.

>>> unserialized = {
...     "a0b1c2d3e4f5": {"is_uaa": True, "is_unicast": True},
...     "a0b1c2d3e4f6": {"is_uaa": True, "is_unicast": True},
...     "a0b1c2d3e4f7": {"is_uaa": True, "is_unicast": True},
...     "a0b1c2d3e4f8": {"is_uaa": True, "is_unicast": True},
...     "a0b1c2d3e4f9": {"is_uaa": True, "is_unicast": True},
...     "a0b1c2d3e4fa": {"is_uaa": True, "is_unicast": True},
...     "a0b1c2d3e4fb": {"is_uaa": True, "is_unicast": True},
...     "a0b1c2d3e4fc": {"is_uaa": True, "is_unicast": True},
...     "a0b1c2d3e4fd": {"is_uaa": True, "is_unicast": True},
...     "a0b1c2d3e4fe": {"is_uaa": True, "is_unicast": True},
...     "a0b1c2d3e4ff": {"is_uaa": True, "is_unicast": True}
... }

# Call `json.dumps` on the unserialized addresses.

>>> serialized = dumps(unserialized, indent=2)
>>> print(serialized)
{
  "a0b1c2d3e4f5": {
    "is_uaa": true,
    "is_unicast": true
  },
  "a0b1c2d3e4f6": {
    "is_uaa": true,
    "is_unicast": true
  },
  "a0b1c2d3e4f7": {
    "is_uaa": true,
    "is_unicast": true
  },
  "a0b1c2d3e4f8": {
    "is_uaa": true,
    "is_unicast": true
  },
  "a0b1c2d3e4f9": {
    "is_uaa": true,
    "is_unicast": true
  },
  "a0b1c2d3e4fa": {
    "is_uaa": true,
    "is_unicast": true
  },
  "a0b1c2d3e4fb": {
    "is_uaa": true,
    "is_unicast": true
  },
  "a0b1c2d3e4fc": {
    "is_uaa": true,
    "is_unicast": true
  },
  "a0b1c2d3e4fd": {
    "is_uaa": true,
    "is_unicast": true
  },
  "a0b1c2d3e4fe": {
    "is_uaa": true,
    "is_unicast": true
  },
  "a0b1c2d3e4ff": {
    "is_uaa": true,
    "is_unicast": true
  }
}