diff --git a/generate-whitelist.py b/generate-whitelist.py
index c732726..eaf87b1 100755
--- a/generate-whitelist.py
+++ b/generate-whitelist.py
@@ -1,6 +1,8 @@
 #!/usr/bin/env python3
 
-import re, sys, os.path
+import re
+import sys
+
 
 def usage():
     sys.stderr.write("Usage: $0 whitelist-config-in whitelist-header-out\n")
@@ -8,30 +10,36 @@
     sys.stderr.write("    and outputs a header file\n")
     sys.exit(-1)
 
+
 class Error(Exception):
     pass
 
+
 class DuplicateEntry(Error):
     def __init__(self, e):
         super(Error, self).__init__(
-             "Multiple entries with matching netfn/cmd found ({})".format(e))
+            "Multiple entries with matching netfn/cmd found ({})".format(e)
+        )
+
 
 class ParseError(Error):
     def __init__(self, d):
         super(Error, self).__init__("Parse error at: '{}'".format(d))
 
+
 class entry:
     linere = re.compile(
-            r'(0x[0-9a-f]{2}):(0x[0-9a-f]{2})((:(0x[0-9a-f]{4}))?)\s*((//\s*(.*))?)',
-            re.I
-        )
+        r"(0x[0-9a-f]{2}):(0x[0-9a-f]{2})((:(0x[0-9a-f]{4}))?)\s*((//\s*(.*))?)",
+        re.I,
+    )
+
     def __init__(self, data):
         # parse data line into values:
         # type 1, two values: netfn, cmd
         # type 2, three values: netfn, cmd, channels
         try:
             m = self.linere.fullmatch(data).groups()
-        except:
+        except Exception:
             raise ParseError(data)
         self.netfn = int(m[0], 16)
         self.cmd = int(m[1], 16)
@@ -40,32 +48,39 @@
         else:
             # if no channel was provided, default to previous behavior, which
             # is allow all interfaces, including the system interface (ch 15)
-            self.channels = 0xffff
+            self.channels = 0xFFFF
         if m[6] is not None:
             self.comment = "// " + m[7]
         else:
             self.comment = "//"
+
     def __str__(self):
-        return " ".join([ '{',
-            "0x{0.netfn:02x},".format(self),
-            "0x{0.cmd:02x},".format(self),
-            "0x{0.channels:04x}".format(self),
-            "},",
-            "{0.comment}".format(self),
-        ])
+        return " ".join(
+            [
+                "{",
+                "0x{0.netfn:02x},".format(self),
+                "0x{0.cmd:02x},".format(self),
+                "0x{0.channels:04x}".format(self),
+                "},",
+                "{0.comment}".format(self),
+            ]
+        )
+
     def __lt__(self, other):
         if self.netfn == other.netfn:
             return self.cmd < other.cmd
         return self.netfn < other.netfn
+
     def match(self, other):
         return (self.netfn == other.netfn) and (self.cmd == other.cmd)
 
+
 def parse(config):
     entries = []
     with open(config) as f:
         for line in f:
             line = line.strip()
-            if len(line) == 0 or line[0] == '#':
+            if len(line) == 0 or line[0] == "#":
                 continue
             e = entry(line)
             if any([e.match(item) for item in entries]):
@@ -76,23 +91,28 @@
     entries.sort()
     return entries
 
+
 def output(entries, hppfile):
     lines = [
-            "#pragma once",
-            "",
-            "// AUTOGENERATED FILE; DO NOT MODIFY",
-            "",
-            "#include <array>",
-            "#include <tuple>",
-            "",
-            "using netfncmd_tuple = std::tuple<unsigned char, unsigned char, unsigned short>;",
-            "",
-            "constexpr const std::array<netfncmd_tuple, {}> whitelist = ".format(
-                    len(entries)),
-            "{{"
-            ]
-    lines.extend(['    {}'.format(e) for e in entries])
-    lines.append("}};\n");
+        "#pragma once",
+        "",
+        "// AUTOGENERATED FILE; DO NOT MODIFY",
+        "",
+        "#include <array>",
+        "#include <tuple>",
+        "",
+        (
+            "using netfncmd_tuple = std::tuple<unsigned char, unsigned char,"
+            " unsigned short>;"
+        ),
+        "",
+        "constexpr const std::array<netfncmd_tuple, {}> whitelist = ".format(
+            len(entries)
+        ),
+        "{{",
+    ]
+    lines.extend(["    {}".format(e) for e in entries])
+    lines.append("}};\n")
 
     with open(hppfile, "w") as hpp:
         hpp.write("\n".join(lines))
