【问题标题】:How to use decorator in my package如何在我的包中使用装饰器
【发布时间】:2018-05-06 07:00:38
【问题描述】:

我想在我的原始包中使用原始装饰器(例如,'mypackage' 中的'with_error_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>

为什么会出现这些错误? 如何解决?

【问题讨论】:

  • print strError 与 Python-3.x 的使用不一致。
  • 您正在混淆“开箱即用”的装饰创建和decorator.decorator 第三方库。他们互相干扰,坚持一个。
  • 还有:if __name__ == '__main__'
  • 很抱歉我的代码不正确。我会小心的。
  • 我修好了。

标签: python python-3.x package decorator wrapper


【解决方案1】:

不需要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,){})

【讨论】:

  • Also: ` >>>divnum(0) Traceback(最近一次调用最后):文件“/home/user/mypackage.py”,第 8 行,在 error_handler return func(*args, * *kwargs) 文件“/home/user/mypackagetest.py”,第 5 行,在 divnum print(1/num) ZeroDivisionError: 除以零 /home/user/mypackage.py((0,){}) `跨度>
  • @bigmacd。你的意思是在出现错误时显示事情的进展可能是一个好主意吗?你是对的。
  • @Kanak 我意识到我想做的事。谢谢
猜你喜欢
  • 2022-01-07
  • 2018-06-08
  • 2018-02-19
  • 2016-04-08
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
相关资源
最近更新 更多