代码之家  ›  专栏  ›  技术社区  ›  Ryohei

如何在我的软件包中使用decorator

  •  -1
  • Ryohei  · 技术社区  · 7 年前

    我想在我的原始包中使用原始decorator(例如“mypackage”中的“with\u error\u handler”)并执行一些函数。 但它返回的函数对象或错误消息也是给定的参数。

    在我的软件包中:

    def with_error_handler(func):
        import traceback
        from functools import wraps
        from decorator import decorator
        @decorator
        @wraps(func)
        def error_handler(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            except Exception as e:
                strError = traceback.format_exc() + __file__ + '(' + str(args) + str(kwargs) + ')'
                print(strError)
        return error_handler
    

    我想执行以下代码。

    import mypackage
    
    @mypackage.with_error_handler
    def divnum(num):
        print(1/num)
    
    @mypackage.with_error_handler
    def divone():
        print(1/1)
    
    if __name__ == '__main__':
        divnum(2)
        divone()
    

    这些结果在这里

    >>>divnum(2)
    ・・・with_error_handler() takes 1 positional argument but 2 were given
    >>>divone()
    ・・・<function __main__.divone>
    

    为什么会发生这些错误? 如何修复?

    1 回复  |  直到 7 年前
        1
  •  1
  •   keepAlive    7 年前

    没有必要 from decorator import decorator . 正在做

    import functools as ft
    import traceback
    
    def with_error_handler(func):
        @ft.wraps(func)
        def error_handler(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            except Exception as e:
                strError = traceback.format_exc() + __file__ + '(' + str(args) + str(kwargs) + ')'
                print(strError)
        return error_handler
    

    没关系。

    >>> divone()
    1.0
    >>> divnum(2)
    0.5
    

    正如所料

    >>> divnum(0)
    Traceback (most recent call last): 
      File "/home/user/mypackage.py", line <X>, in error_handler
        return func(*args, **kwargs)
      File "/home/user/mypackagetest.py", line <Y>, in divnum
        print(1/num)
    ZeroDivisionError: division by zero 
    /home/user/mypackage.py((0,){})