class_docstr: Base class for all decorators.
class_docstr_tok: ["Base","class","for","all","decorators","."]
code: def make_decorator_spec(self):
      attrs = {
          k: v for k, v in self.attributes.items() if v is not None
      }
      if attrs:
          attr_list = []
          # We dump simple types directly as string to get around the nightmare quote
          # escaping but for more complex types (typically dictionaries or lists),
          # we dump using JSON.
          for k, v in attrs.items():
              if isinstance(v, (int, float, unicode, basestring)):
                  attr_list.append("%s=%s" % (k, str(v)))
              else:
                  attr_list.append(
                      "%s=%s" % (k, json.dumps(v).replace('"', '\\"'))
                  )
          attrstr = ",".join(attr_list)
          return "%s:%s" % (self.name, attrstr)
      else:
          return self.name
  
imports: from functools import partial
  import json
  import re
  import os
  import sys
  from .flowspec import FlowSpec
  from .exception import MetaflowInternalError, MetaflowException, InvalidDecoratorAttribute
  from metaflow._vendor import click
label_desc: Use image node_id 3 for calling the Decorator obj's underlying member method code with example usage: obj.make_decorator_spec() and returns: unknown, self