首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Monkeypatching logging.Logger -参数是如何工作的?

Monkeypatching logging.Logger -参数是如何工作的?
EN

Stack Overflow用户
提问于 2014-07-07 11:28:43
回答 1查看 869关注 0票数 0

我有一个我编写的日志类,我喜欢使用它。它看起来是这样的:

代码语言:javascript
复制
class EasyLogger(object):
    SEP = " "

    def __init__(self, logger=logging.getLogger(__name__)):
        self.logger = logger

    def _format_str(self, *args):
        return self.SEP.join([str(a) for a in args])

    def debug(self, *args):
        self.logger.debug(self._format_str(*args))

    .... repeated for the other logging methods, like info, warning, etc....

    def __getattr__(self, name):
        return getattr(self.logger, name)

这给我提供了类似如下的语法:

代码语言:javascript
复制
LOG.debug("some_variable: ", some_variable)

我很喜欢。我不想从logging.Logger继承,因为组合比继承更好,而且我真的不想和那样的内置类打交道。

我的格式字符串如下所示:

代码语言:javascript
复制
LOGGING_FMT = "<%(filename)s:%(lineno)s(%(levelname)s) - %(funcName)s() >"\
                        "%(message)s"

但是这不起作用,因为行号和函数名总是在easylogger.py中报告,而不是作为调用函数报告。

我已经修复了这个问题,我遵循了this fantastic answer,并对EasyLogger.loggerfindCaller方法进行了修改,如下所示:

代码语言:javascript
复制
def __init__(self, logger=logging.getLogger(__name__)):
    self.logger = logger
    # Ugly, ugly, ugly dirty hack to fix line numbers
    self.logger.findCaller = find_caller_monkeypatch

这行得通,但我很困惑。我最初使用以下签名定义了find_caller_monkeypatch

代码语言:javascript
复制
def find_caller_monkeypatch(self):

(函数体是链接的答案中的copy+pasted )。但是,这会导致一个错误:

代码语言:javascript
复制
  File "/usr/lib64/python2.7/logging/__init__.py", line 1262, in _log
    fn, lno, func = self.findCaller()
TypeError: find_caller_monkeypatch() takes exactly 1 argument (0 given)

self作为参数删除到find_caller_multipatch可以修复这个错误,但我很困惑:为什么find_caller_monkeypatch在作为self.findCaller()调用时不能将self作为参数?如果方法是在类中定义的,是否只将self作为参数获取?

以下代码片段是同一问题的较小示例:

代码语言:javascript
复制
In [7]: class Foo(object):
   ...:     def say_hi(self):
   ...:         print "Hello World"
   ...:         

In [8]: def say_bye_self(self): print "Goodbye world"

In [9]: def say_bye(): print "Goodbye world"

In [10]: foo = Foo()

In [11]: foo.say_hi()
Hello World

In [12]: foo.say_hi = say_bye_self

In [13]: foo.say_hi()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-10baea358e0b> in <module>()
----> 1 foo.say_hi()

TypeError: say_bye_self() takes exactly 1 argument (0 given)

In [14]: foo.say_hi = say_bye

In [15]: foo.say_hi()
Goodbye world

这里发生了什么事?

EN

回答 1

Stack Overflow用户

发布于 2014-07-07 18:32:44

你可以在这个类上使用Monkeypatch

代码语言:javascript
复制
Foo.say_hi = say_bye_self
foo = Foo()
foo.say_hi()

或者,您也可以使用Monkeypatch实例

代码语言:javascript
复制
import types
foo.say_hi = types.MethodType(say_bye_self, foo)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24602655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档