title: Using a decorator to inject a function in Python
body: <pre><code>import functools
  import logging
  def logDeprecated( msg=None, *args, **kwargs ):
      """Log a message at level 'WARNING'
  
      Args:
          msg=None : (str)
              The message you wish to log.
              If no msg is passed, default to 'This function has been deprecated.'
              All other args are passed directly to logging.Logger.log().
  
      Keyword Args:
          category : (str)
              The category for the message to be logged.  If not
              specified, then an appropriate category will be
              determined based on the calling context.
  
          All other keyword args are passed directly to logging.Logger.log().
  
      Raises:
          n/a
  
      Returns:
          n/a
  
      """
      if not msg:
          msg = "This function has been deprecated."
  
      # Make sure category is stripped from kwargs before passing to log().
      cat = kwargs.pop('category', None)
      if not cat:
          cat = _getLoggingCategory()
      cat = "{0}.DEPRECATED".format(cat)
  
      logging.getLogger( category=cat ).log( logging.WARNING, msg, *args, **kwargs )
  
  def decoratedLogDeprecated(func):
      def thisFunc(*args, **kwargs):
          func(*args, **kwargs)
          logDeprecated()
      return wraps(func)(thisFunc)
  
  @decoratedLogDeprecated
  def somefunc():
      print "This used to work"
  
  def main():
      somefunc()
  
  if __name__ == 'main':
      main()
  </code></pre>
  
  <p>The line number that is getting logged is the line number in main.  When in actuality, it should be reporting the line number in the actual function. </p>
  
  <p>Is there any way to use a decorator to inject that function into the decorated function?  All the help would be greatly appreciated.</p>