diff --git a/.flake8 b/.flake8
new file mode 100644
index 0000000..34a9a9f
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,3 @@
+# Autoformatter friendly flake8 config (all formatting rules disabled)
+[flake8]
+extend-ignore = E1, E2, E3, E501, W1, W2, W3, W5
diff --git a/.isort.cfg b/.isort.cfg
new file mode 100644
index 0000000..b9fb3f3
--- /dev/null
+++ b/.isort.cfg
@@ -0,0 +1,2 @@
+[settings]
+profile=black
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..a8f43fe
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,2 @@
+[tool.black]
+line-length = 79
diff --git a/tools/sdbus++ b/tools/sdbus++
index fbbc3cd..5e31357 100755
--- a/tools/sdbus++
+++ b/tools/sdbus++
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
 from sdbusplus.main import main
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     main()
diff --git a/tools/sdbusplus/__init__.py b/tools/sdbusplus/__init__.py
index 4703f22..1f509e4 100644
--- a/tools/sdbusplus/__init__.py
+++ b/tools/sdbusplus/__init__.py
@@ -1,2 +1,4 @@
-from sdbusplus.interface import Interface
 from sdbusplus.error import Error
+from sdbusplus.interface import Interface
+
+__all__ = ["Error", "Interface"]
diff --git a/tools/sdbusplus/error.py b/tools/sdbusplus/error.py
index 398ebe7..e30a59a 100644
--- a/tools/sdbusplus/error.py
+++ b/tools/sdbusplus/error.py
@@ -1,5 +1,7 @@
 import os
+
 import yaml
+
 from .namedelement import NamedElement
 from .renderer import Renderer
 
diff --git a/tools/sdbusplus/interface.py b/tools/sdbusplus/interface.py
index a35c99a..3f6d9b3 100644
--- a/tools/sdbusplus/interface.py
+++ b/tools/sdbusplus/interface.py
@@ -1,18 +1,21 @@
 import os
+
 import yaml
+
+from .enum import Enum
+from .method import Method
 from .namedelement import NamedElement
 from .property import Property
-from .method import Method
-from .signal import Signal
-from .enum import Enum
 from .renderer import Renderer
+from .signal import Signal
 
 
 class Interface(NamedElement, Renderer):
     @staticmethod
     def load(name, rootdir="."):
-        filename = os.path.join(rootdir,
-                                name.replace(".", "/") + ".interface.yaml")
+        filename = os.path.join(
+            rootdir, name.replace(".", "/") + ".interface.yaml"
+        )
 
         with open(filename) as f:
             data = f.read()
@@ -28,7 +31,7 @@
 
         super(Interface, self).__init__(**kwargs)
 
-        self.namespaces = self.name.split('.')
+        self.namespaces = self.name.split(".")
         self.classname = self.namespaces.pop()
 
     def cppNamespace(self):
diff --git a/tools/sdbusplus/main.py b/tools/sdbusplus/main.py
index b7c56d0..e056942 100644
--- a/tools/sdbusplus/main.py
+++ b/tools/sdbusplus/main.py
@@ -1,9 +1,10 @@
-import sdbusplus
-import mako.lookup
 import argparse
-import sys
 import os
 
+import mako.lookup
+
+import sdbusplus
+
 
 def main():
     module_path = os.path.dirname(sdbusplus.__file__)
diff --git a/tools/sdbusplus/method.py b/tools/sdbusplus/method.py
index 7dbb421..726355e 100644
--- a/tools/sdbusplus/method.py
+++ b/tools/sdbusplus/method.py
@@ -1,17 +1,15 @@
-from .property import Property
 from .namedelement import NamedElement
+from .property import Property
 from .renderer import Renderer
 
 
 class Method(NamedElement, Renderer):
     def __init__(self, **kwargs):
-        self.parameters = \
-            [Property(**p) for p in kwargs.pop('parameters', [])]
-        self.returns = \
-            [Property(**r) for r in kwargs.pop('returns', [])]
-        self.flags = kwargs.pop('flags', [])
+        self.parameters = [Property(**p) for p in kwargs.pop("parameters", [])]
+        self.returns = [Property(**r) for r in kwargs.pop("returns", [])]
+        self.flags = kwargs.pop("flags", [])
         self.cpp_flags = self.or_cpp_flags(self.flags)
-        self.errors = kwargs.pop('errors', [])
+        self.errors = kwargs.pop("errors", [])
 
         super(Method, self).__init__(**kwargs)
 
@@ -19,12 +17,19 @@
         return self.render(loader, "method.md.mako", method=self)
 
     def cpp_prototype(self, loader, interface, ptype):
-        return self.render(loader, "method.prototype.hpp.mako", method=self,
-                           interface=interface, ptype=ptype, post=str.rstrip)
+        return self.render(
+            loader,
+            "method.prototype.hpp.mako",
+            method=self,
+            interface=interface,
+            ptype=ptype,
+            post=str.rstrip,
+        )
 
     def returns_as_list(self, interface, full=False):
-        return ", ".join([r.cppTypeParam(interface.name, full=full)
-                         for r in self.returns])
+        return ", ".join(
+            [r.cppTypeParam(interface.name, full=full) for r in self.returns]
+        )
 
     def cpp_return_type(self, interface):
         if len(self.returns) == 0:
@@ -32,9 +37,7 @@
         elif len(self.returns) == 1:
             return self.returns[0].cppTypeParam(interface.name)
         else:
-            return "std::tuple<" + \
-                   self.returns_as_list(interface) + \
-                   ">"
+            return "std::tuple<" + self.returns_as_list(interface) + ">"
 
     def parameter(self, interface, p, defaultValue=False):
         r = "%s %s" % (p.cppTypeParam(interface.name), p.camelCase)
@@ -44,21 +47,26 @@
 
     def get_parameters_str(self, interface, defaultValue=False):
         return ",\n            ".join(
-            [self.parameter(interface, p, defaultValue)
-                for p in self.parameters])
+            [
+                self.parameter(interface, p, defaultValue)
+                for p in self.parameters
+            ]
+        )
 
     def or_cpp_flags(self, flags):
         """Return the corresponding ORed cpp flags."""
-        flags_dict = {"deprecated": "vtable::common_::deprecated",
-                      "hidden": "vtable::common_::hidden",
-                      "unprivileged": "vtable::common_::unprivileged",
-                      "no_reply": "vtable::method_::no_reply"}
+        flags_dict = {
+            "deprecated": "vtable::common_::deprecated",
+            "hidden": "vtable::common_::hidden",
+            "unprivileged": "vtable::common_::unprivileged",
+            "no_reply": "vtable::method_::no_reply",
+        }
 
         cpp_flags = []
         for flag in flags:
             try:
                 cpp_flags.append(flags_dict[flag])
             except KeyError:
-                raise ValueError("Invalid flag \"{}\"".format(flag))
+                raise ValueError('Invalid flag "{}"'.format(flag))
 
         return " | ".join(cpp_flags)
diff --git a/tools/sdbusplus/namedelement.py b/tools/sdbusplus/namedelement.py
index a1d617f..c7985cf 100644
--- a/tools/sdbusplus/namedelement.py
+++ b/tools/sdbusplus/namedelement.py
@@ -1,12 +1,13 @@
-import inflection
 import re
 
+import inflection
+
 
 class NamedElement(object):
     def __init__(self, **kwargs):
         super(NamedElement, self).__init__()
-        self.name = kwargs.pop('name', "unnamed")
-        self.description = kwargs.pop('description', "")
+        self.name = kwargs.pop("name", "unnamed")
+        self.description = kwargs.pop("description", "")
 
         if not isinstance(self.name, str):
             raise AttributeError(
@@ -15,44 +16,127 @@
             )
 
     def __getattribute__(self, name):
-        lam = {'CamelCase': lambda: inflection.camelize(self.name),
-               'camelCase': lambda: NamedElement.lower_camel_case(self.name),
-               'snake_case': lambda: inflection.underscore(self.name)}\
-            .get(name)
+        lam = {
+            "CamelCase": lambda: inflection.camelize(self.name),
+            "camelCase": lambda: NamedElement.lower_camel_case(self.name),
+            "snake_case": lambda: inflection.underscore(self.name),
+        }.get(name)
 
         if lam:
             return NamedElement.__fixup_name(lam())
         try:
             return super(NamedElement, self).__getattribute__(name)
         except Exception:
-            raise AttributeError("Attribute '%s' not found in %s.NamedElement"
-                                 % (name, self.__module__))
+            raise AttributeError(
+                "Attribute '%s' not found in %s.NamedElement"
+                % (name, self.__module__)
+            )
 
     """ Some names are reserved in some languages.  Fixup names to avoid using
         reserved words.
     """
+
     @staticmethod
     def __fixup_name(name):
         # List of reserved words from http://en.cppreference.com/w/cpp/keyword
-        cppReserved = frozenset({
-            "alignas", "alignof", "and", "and_eq", "asm", "auto",
-            "bitand", "bitor", "bool", "break", "case", "catch", "char",
-            "char8_t", "char16_t", "char32_t", "class", "compl", "concept",
-            "const", "consteval", "constexpr", "constinit", "const_cast",
-            "continue", "co_await", "co_return", "co_yield", "decltype",
-            "default", "delete", "do", "double", "dynamic_cast", "else",
-            "enum", "explicit", "export", "extern", "false", "float", "for",
-            "friend", "goto", "if", "inline", "int", "long", "mutable",
-            "namespace", "new", "noexcept", "not", "not_eq", "nullptr",
-            "operator", "or", "or_eq", "private", "protected", "public",
-            "register", "reinterpret_cast", "requires", "return", "short",
-            "signed", "sizeof", "static", "static_assert", "static_cast",
-            "struct", "switch", "template", "this", "thread_local", "throw",
-            "true", "try", "typedef", "typeid", "typename", "union",
-            "unsigned", "using", "virtual", "void", "volatile", "wchar_t",
-            "while", "xor", "xor_eq"})
+        cppReserved = frozenset(
+            {
+                "alignas",
+                "alignof",
+                "and",
+                "and_eq",
+                "asm",
+                "auto",
+                "bitand",
+                "bitor",
+                "bool",
+                "break",
+                "case",
+                "catch",
+                "char",
+                "char8_t",
+                "char16_t",
+                "char32_t",
+                "class",
+                "compl",
+                "concept",
+                "const",
+                "consteval",
+                "constexpr",
+                "constinit",
+                "const_cast",
+                "continue",
+                "co_await",
+                "co_return",
+                "co_yield",
+                "decltype",
+                "default",
+                "delete",
+                "do",
+                "double",
+                "dynamic_cast",
+                "else",
+                "enum",
+                "explicit",
+                "export",
+                "extern",
+                "false",
+                "float",
+                "for",
+                "friend",
+                "goto",
+                "if",
+                "inline",
+                "int",
+                "long",
+                "mutable",
+                "namespace",
+                "new",
+                "noexcept",
+                "not",
+                "not_eq",
+                "nullptr",
+                "operator",
+                "or",
+                "or_eq",
+                "private",
+                "protected",
+                "public",
+                "register",
+                "reinterpret_cast",
+                "requires",
+                "return",
+                "short",
+                "signed",
+                "sizeof",
+                "static",
+                "static_assert",
+                "static_cast",
+                "struct",
+                "switch",
+                "template",
+                "this",
+                "thread_local",
+                "throw",
+                "true",
+                "try",
+                "typedef",
+                "typeid",
+                "typename",
+                "union",
+                "unsigned",
+                "using",
+                "virtual",
+                "void",
+                "volatile",
+                "wchar_t",
+                "while",
+                "xor",
+                "xor_eq",
+            }
+        )
 
-        while(name in cppReserved):
+        while name in cppReserved:
             name = name + "_"
 
         return name
@@ -78,15 +162,17 @@
         # ex. "IPv6Address" -> "ipv6Address"
         if re.match(r"^[A-Z]+v[0-9]", upper_name):
             return re.sub(
-                    r"^([A-Z]+)(.*)$",
-                    lambda m: m.group(1).lower() + m.group(2),
-                    upper_name)
+                r"^([A-Z]+)(.*)$",
+                lambda m: m.group(1).lower() + m.group(2),
+                upper_name,
+            )
 
         # Anything left has at least two sequential upper-case, so it is an
         # acronym.  Switch all but the last upper-case (which starts the next
         # word) to lower-case.
         # ex. "MACAddress" -> "macAddress".
         return re.sub(
-                r"^([A-Z]+)([A-Z].*)$",
-                lambda m: m.group(1).lower() + m.group(2),
-                upper_name)
+            r"^([A-Z]+)([A-Z].*)$",
+            lambda m: m.group(1).lower() + m.group(2),
+            upper_name,
+        )
diff --git a/tools/sdbusplus/property.py b/tools/sdbusplus/property.py
index 23c0ba7..844b8e0 100644
--- a/tools/sdbusplus/property.py
+++ b/tools/sdbusplus/property.py
@@ -1,6 +1,7 @@
+import yaml
+
 from .namedelement import NamedElement
 from .renderer import Renderer
-import yaml
 
 
 class Property(NamedElement, Renderer):
@@ -9,55 +10,72 @@
     NONLOCAL_ENUM_MAGIC = "<NONLOCAL_ENUM>"
 
     def __init__(self, **kwargs):
-        self.typeName = kwargs.pop('type', None)
+        self.typeName = kwargs.pop("type", None)
         self.cppTypeName = self.parse_cpp_type()
-        self.defaultValue = kwargs.pop('default', None)
-        self.flags = kwargs.pop('flags', [])
+        self.defaultValue = kwargs.pop("default", None)
+        self.flags = kwargs.pop("flags", [])
         self.cpp_flags = self.or_cpp_flags(self.flags)
-        self.errors = kwargs.pop('errors', [])
+        self.errors = kwargs.pop("errors", [])
 
-        if (self.defaultValue is not None):
-            if (isinstance(self.defaultValue, bool)):
+        if self.defaultValue is not None:
+            if isinstance(self.defaultValue, bool):
                 # Convert True/False to 'true'/'false'
                 # because it will be rendered as C++ code
-                self.defaultValue = 'true' if self.defaultValue else 'false'
-            elif(isinstance(self.defaultValue, str) and
-                 self.typeName.lower() == "string"):
+                self.defaultValue = "true" if self.defaultValue else "false"
+            elif (
+                isinstance(self.defaultValue, str)
+                and self.typeName.lower() == "string"
+            ):
                 # Wrap string type default values with double-quotes
-                self.defaultValue = "\"" + self.defaultValue + "\""
-            elif(isinstance(self.defaultValue, str) and
-                    self.is_floating_point()):
+                self.defaultValue = '"' + self.defaultValue + '"'
+            elif (
+                isinstance(self.defaultValue, str) and self.is_floating_point()
+            ):
                 if self.defaultValue.lower() == "nan":
-                    self.defaultValue = \
-                        f'std::numeric_limits<{self.cppTypeName}>::quiet_NaN()'
+                    self.defaultValue = (
+                        f"std::numeric_limits<{self.cppTypeName}>::quiet_NaN()"
+                    )
                 elif self.defaultValue.lower() == "infinity":
-                    self.defaultValue = \
-                        f'std::numeric_limits<{self.cppTypeName}>::infinity()'
+                    self.defaultValue = (
+                        f"std::numeric_limits<{self.cppTypeName}>::infinity()"
+                    )
                 elif self.defaultValue.lower() == "-infinity":
-                    self.defaultValue = \
-                        f'-std::numeric_limits<{self.cppTypeName}>::infinity()'
+                    self.defaultValue = (
+                        f"-std::numeric_limits<{self.cppTypeName}>::infinity()"
+                    )
                 elif self.defaultValue.lower() == "epsilon":
-                    self.defaultValue = \
-                        f'std::numeric_limits<{self.cppTypeName}>::epsilon()'
-            elif(isinstance(self.defaultValue, str) and
-                    self.is_integer()):
+                    self.defaultValue = (
+                        f"std::numeric_limits<{self.cppTypeName}>::epsilon()"
+                    )
+            elif isinstance(self.defaultValue, str) and self.is_integer():
                 if self.defaultValue.lower() == "maxint":
-                    self.defaultValue = \
-                        f'std::numeric_limits<{self.cppTypeName}>::max()'
+                    self.defaultValue = (
+                        f"std::numeric_limits<{self.cppTypeName}>::max()"
+                    )
                 elif self.defaultValue.lower() == "minint":
-                    self.defaultValue = \
-                        f'std::numeric_limits<{self.cppTypeName}>::min()'
+                    self.defaultValue = (
+                        f"std::numeric_limits<{self.cppTypeName}>::min()"
+                    )
 
         super(Property, self).__init__(**kwargs)
 
     def is_enum(self):
         if not self.typeName:
             return False
-        return 'enum' == self.__type_tuple()[0]
+        return "enum" == self.__type_tuple()[0]
 
     def is_integer(self):
-        return self.typeName in ["byte", "int16", "uint16", "int32", "uint32",
-                                 "int64", "uint64", "size", "ssize"]
+        return self.typeName in [
+            "byte",
+            "int16",
+            "uint16",
+            "int32",
+            "uint32",
+            "int64",
+            "uint64",
+            "size",
+            "ssize",
+        ]
 
     def is_floating_point(self):
         return self.typeName in ["double"]
@@ -65,6 +83,7 @@
     """ Return a conversion of the cppTypeName valid as a function parameter.
         Currently only 'enum' requires conversion.
     """
+
     def cppTypeParam(self, interface, full=False, server=True):
         return self.__cppTypeParam(interface, self.cppTypeName, full, server)
 
@@ -98,15 +117,17 @@
 
     """ Determine the C++ namespaces of an enumeration-type property.
     """
+
     def enum_namespaces(self, interface):
         typeTuple = self.__type_tuple()
         return self.__enum_namespaces(interface, typeTuple)
 
     def __enum_namespaces(self, interface, typeTuple):
         # Enums can be processed directly.
-        if 'enum' == typeTuple[0]:
-            cppType = self.__cppTypeParam(interface,
-                                          self.__parse_cpp_type__(typeTuple))
+        if "enum" == typeTuple[0]:
+            cppType = self.__cppTypeParam(
+                interface, self.__parse_cpp_type__(typeTuple)
+            )
             ns = cppType.split("::")[0:-1]
             if len(ns) != 0:
                 return ["::".join(ns) + "::"]
@@ -126,6 +147,7 @@
 
     """ Convert the property type into a C++ type.
     """
+
     def parse_cpp_type(self):
         if not self.typeName:
             return None
@@ -136,6 +158,7 @@
     """ Convert the 'typeName' into a tuple of ('type', [ details ]) where
         'details' is a recursive type-tuple.
     """
+
     def __type_tuple(self):
         if not self.typeName:
             return None
@@ -157,6 +180,7 @@
             [('dict', [('string', []), ('dict', [('string', []),
              ('int64', [])]]]
     """
+
     def __preprocess_yaml_type_array(self, typeArray):
         result = []
 
@@ -167,10 +191,13 @@
 
             # If there is a next element and it is a list, merge it with the
             # current element.
-            if i < len(typeArray)-1 and type(typeArray[i+1]) is list:
+            if i < len(typeArray) - 1 and type(typeArray[i + 1]) is list:
                 result.append(
-                    (typeArray[i],
-                     self.__preprocess_yaml_type_array(typeArray[i+1])))
+                    (
+                        typeArray[i],
+                        self.__preprocess_yaml_type_array(typeArray[i + 1]),
+                    )
+                )
             else:
                 result.append((typeArray[i], []))
 
@@ -180,33 +207,41 @@
             [ variant [ dict [ int32, int32 ], double ] ]
         This function then converts the type-list into a C++ type string.
     """
+
     def __parse_cpp_type__(self, typeTuple):
         propertyMap = {
-            'byte': {'cppName': 'uint8_t', 'params': 0},
-            'boolean': {'cppName': 'bool', 'params': 0},
-            'int16': {'cppName': 'int16_t', 'params': 0},
-            'uint16': {'cppName': 'uint16_t', 'params': 0},
-            'int32': {'cppName': 'int32_t', 'params': 0},
-            'uint32': {'cppName': 'uint32_t', 'params': 0},
-            'int64': {'cppName': 'int64_t', 'params': 0},
-            'uint64': {'cppName': 'uint64_t', 'params': 0},
-            'size': {'cppName': 'size_t', 'params': 0},
-            'ssize': {'cppName': 'ssize_t', 'params': 0},
-            'double': {'cppName': 'double', 'params': 0},
-            'unixfd': {'cppName': 'sdbusplus::message::unix_fd', 'params': 0},
-            'string': {'cppName': 'std::string', 'params': 0},
-            'path': {'cppName': 'sdbusplus::message::object_path',
-                     'params': 0},
-            'object_path': {'cppName': 'sdbusplus::message::object_path',
-                            'params': 0},
-            'signature': {'cppName': 'sdbusplus::message::signature',
-                          'params': 0},
-            'array': {'cppName': 'std::vector', 'params': 1},
-            'set': {'cppName': 'std::set', 'params': 1},
-            'struct': {'cppName': 'std::tuple', 'params': -1},
-            'variant': {'cppName': 'std::variant', 'params': -1},
-            'dict': {'cppName': 'std::map', 'params': 2},
-            'enum': {'cppName': 'enum', 'params': 1}}
+            "byte": {"cppName": "uint8_t", "params": 0},
+            "boolean": {"cppName": "bool", "params": 0},
+            "int16": {"cppName": "int16_t", "params": 0},
+            "uint16": {"cppName": "uint16_t", "params": 0},
+            "int32": {"cppName": "int32_t", "params": 0},
+            "uint32": {"cppName": "uint32_t", "params": 0},
+            "int64": {"cppName": "int64_t", "params": 0},
+            "uint64": {"cppName": "uint64_t", "params": 0},
+            "size": {"cppName": "size_t", "params": 0},
+            "ssize": {"cppName": "ssize_t", "params": 0},
+            "double": {"cppName": "double", "params": 0},
+            "unixfd": {"cppName": "sdbusplus::message::unix_fd", "params": 0},
+            "string": {"cppName": "std::string", "params": 0},
+            "path": {
+                "cppName": "sdbusplus::message::object_path",
+                "params": 0,
+            },
+            "object_path": {
+                "cppName": "sdbusplus::message::object_path",
+                "params": 0,
+            },
+            "signature": {
+                "cppName": "sdbusplus::message::signature",
+                "params": 0,
+            },
+            "array": {"cppName": "std::vector", "params": 1},
+            "set": {"cppName": "std::set", "params": 1},
+            "struct": {"cppName": "std::tuple", "params": -1},
+            "variant": {"cppName": "std::variant", "params": -1},
+            "dict": {"cppName": "std::map", "params": 2},
+            "enum": {"cppName": "enum", "params": 1},
+        }
 
         if len(typeTuple) != 2:
             raise RuntimeError("Invalid typeTuple %s" % typeTuple)
@@ -214,11 +249,11 @@
         first = typeTuple[0]
         entry = propertyMap[first]
 
-        result = entry['cppName']
+        result = entry["cppName"]
 
         # Handle 0-entry parameter lists.
-        if (entry['params'] == 0):
-            if (len(typeTuple[1]) != 0):
+        if entry["params"] == 0:
+            if len(typeTuple[1]) != 0:
                 raise RuntimeError("Invalid typeTuple %s" % typeTuple)
             else:
                 return result
@@ -227,12 +262,13 @@
         rest = typeTuple[1]
 
         # Confirm parameter count matches.
-        if (entry['params'] != -1) and (entry['params'] != len(rest)):
-            raise RuntimeError("Invalid entry count for %s : %s" %
-                               (first, rest))
+        if (entry["params"] != -1) and (entry["params"] != len(rest)):
+            raise RuntimeError(
+                "Invalid entry count for %s : %s" % (first, rest)
+            )
 
         # Switch enum for proper type.
-        if result == 'enum':
+        if result == "enum":
             result = rest[0][0]
 
             # self. means local type.
@@ -240,27 +276,33 @@
                 return result.replace("self.", self.LOCAL_ENUM_MAGIC + "::")
 
             # Insert place-holder for header-type namespace (ex. "server")
-            result = result.split('.')
+            result = result.split(".")
             result.insert(-2, self.NONLOCAL_ENUM_MAGIC)
             result = "::".join(result)
             return result
 
         # Parse each parameter entry, if appropriate, and create C++ template
         # syntax.
-        result += '<'
+        result += "<"
         result += ", ".join([self.__parse_cpp_type__(e) for e in rest])
-        result += '>'
+        result += ">"
 
         return result
 
     def markdown(self, loader):
-        return self.render(loader, "property.md.mako", property=self,
-                           post=str.strip)
+        return self.render(
+            loader, "property.md.mako", property=self, post=str.strip
+        )
 
     def cpp_prototype(self, loader, interface, ptype):
-        return self.render(loader, "property.prototype.hpp.mako",
-                           property=self, interface=interface, ptype=ptype,
-                           post=str.rstrip)
+        return self.render(
+            loader,
+            "property.prototype.hpp.mako",
+            property=self,
+            interface=interface,
+            ptype=ptype,
+            post=str.rstrip,
+        )
 
     def or_cpp_flags(self, flags):
         """Return the corresponding ORed cpp flags."""
@@ -273,7 +315,7 @@
             "hidden": "vtable::common_::hidden",
             "readonly": False,
             "unprivileged": "vtable::common_::unprivileged",
-            }
+        }
 
         cpp_flags = []
         for flag in flags:
@@ -281,6 +323,6 @@
                 if flags_dict[flag]:
                     cpp_flags.append(flags_dict[flag])
             except KeyError:
-                raise ValueError("Invalid flag \"{}\"".format(flag))
+                raise ValueError('Invalid flag "{}"'.format(flag))
 
         return " | ".join(cpp_flags)
diff --git a/tools/sdbusplus/renderer.py b/tools/sdbusplus/renderer.py
index 9a52593..89b65ef 100644
--- a/tools/sdbusplus/renderer.py
+++ b/tools/sdbusplus/renderer.py
@@ -4,6 +4,6 @@
 
     def render(self, loader, template, **kwargs):
         t = loader.get_template(template)
-        post = kwargs.pop('post', lambda result: result)
+        post = kwargs.pop("post", lambda result: result)
         r = t.render(loader=loader, **kwargs)
         return post(r)
diff --git a/tools/sdbusplus/signal.py b/tools/sdbusplus/signal.py
index 066bde9..51d3abc 100644
--- a/tools/sdbusplus/signal.py
+++ b/tools/sdbusplus/signal.py
@@ -1,12 +1,11 @@
-from .property import Property
 from .namedelement import NamedElement
+from .property import Property
 from .renderer import Renderer
 
 
 class Signal(NamedElement, Renderer):
     def __init__(self, **kwargs):
-        self.properties = \
-            [Property(**p) for p in kwargs.pop('properties', [])]
+        self.properties = [Property(**p) for p in kwargs.pop("properties", [])]
 
         super(Signal, self).__init__(**kwargs)
 
@@ -14,5 +13,11 @@
         return self.render(loader, "signal.md.mako", signal=self)
 
     def cpp_prototype(self, loader, interface, ptype):
-        return self.render(loader, "signal.prototype.hpp.mako", signal=self,
-                           interface=interface, ptype=ptype, post=str.rstrip)
+        return self.render(
+            loader,
+            "signal.prototype.hpp.mako",
+            signal=self,
+            interface=interface,
+            ptype=ptype,
+            post=str.rstrip,
+        )
diff --git a/tools/setup.py b/tools/setup.py
index 673affe..c1f8ad6 100755
--- a/tools/setup.py
+++ b/tools/setup.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-from setuptools import setup, find_packages
+from setuptools import find_packages, setup
 
 setup(
     name="sdbusplus",
