nodes: 0, module; 1, function_definition; 2, function_name:attr_list; 3, parameters; 4, block; 5, default_parameter; 6, default_parameter; 7, default_parameter; 8, expression_statement; 9, expression_statement; 10, if_statement; 11, return_statement; 12, identifier:label; 13, None; 14, identifier:kwargs; 15, None; 16, identifier:attributes; 17, None; 18, comment:"""Return assembled DOT attribute list string.
  
      Sorts ``kwargs`` and ``attributes`` if they are plain dicts (to avoid
      unpredictable order from hash randomization in Python 3 versions).
  
      >>> attr_list()
      ''
  
      >>> attr_list('spam spam', kwargs={'eggs': 'eggs', 'ham': 'ham ham'})
      ' [label="spam spam" eggs=eggs ham="ham ham"]'
  
      >>> attr_list(kwargs={'spam': None, 'eggs': ''})
      ' [eggs=""]'
      """; 19, assignment; 20, not_operator; 21, block; 22, binary_operator:' [%s]' % content; 23, identifier:content; 24, call; 25, identifier:content; 26, return_statement; 27, string; 28, identifier:content; 29, identifier:a_list; 30, argument_list; 31, string; 32, string_content:[%s]; 33, identifier:label; 34, identifier:kwargs; 35, identifier:attributes
code: def attr_list(label=None, kwargs=None, attributes=None):
      """Return assembled DOT attribute list string.
  
      Sorts ``kwargs`` and ``attributes`` if they are plain dicts (to avoid
      unpredictable order from hash randomization in Python 3 versions).
  
      >>> attr_list()
      ''
  
      >>> attr_list('spam spam', kwargs={'eggs': 'eggs', 'ham': 'ham ham'})
      ' [label="spam spam" eggs=eggs ham="ham ham"]'
  
      >>> attr_list(kwargs={'spam': None, 'eggs': ''})
      ' [eggs=""]'
      """
      content = a_list(label, kwargs, attributes)
      if not content:
          return ''
      return ' [%s]' % content