def deprecatedMessage(msg, key=None, printStack=False):
if __deprecatedMessagesEnabled is False:<EOL><INDENT>return<EOL><DEDENT>if not _alreadyWarned:<EOL><INDENT>sys.stderr.write('<STR_LIT>')<EOL><DEDENT>if key is None:<EOL><INDENT>from .compat_str import tobytes<EOL>key = md5(tobytes(msg)).hexdigest()<EOL><DEDENT>if key not in _alreadyWarned:<EOL><INDENT>_alreadyWarned[key] = True<EOL>sys.stderr.write('<STR_LIT>' %(msg, ))<EOL>if printStack:<EOL><INDENT>sys.stderr.write('<STR_LIT>')<EOL>curStack = traceback.extract_stack()<EOL>sys.stderr.write('<STR_LIT:U+0020>' + '<STR_LIT>'.join(traceback.format_list(curStack[:-<NUM_LIT:2>])).replace('<STR_LIT:\t>', '<STR_LIT:U+0020>') + '<STR_LIT:\n>')<EOL><DEDENT><DEDENT>
deprecatedMessage - Print a deprecated messsage (unless they are toggled off). Will print a message only once (based on "key")

@param msg <str> - Deprecated message to possibly print

@param key <anything> - A key that is specific to this message. 
        If None is provided (default), one will be generated from the md5 of the message.
        However, better to save cycles and provide a unique key if at all possible.
        The decorator uses the function itself as the key.

@param printStack <bool> Default False, if True print a stack trace