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

Python 如何在我的软件包中使用decorator,python,python-3.x,package,decorator,wrapper,Python,Python 3.x,Package,Decorator,Wrapper,我想在我的原始包中使用原始decorator(例如,“mypackage”中的“with_error_handler”)并执行一些函数。 但它返回的函数对象或错误信息也是给定的参数 在我的包中: def with_error_handler(func): import traceback from functools import wraps from decorator import decorator @decorator @wraps(func)

我想在我的原始包中使用原始decorator(例如,“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>
divnum(2) ➣@with_error_handler()接受1个位置参数,但给出了2个位置参数 >>>divone() ・・・ 为什么会发生这些错误?
如何修复它?

无需从decorator导入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,){})
>divnum(0)
回溯(最近一次呼叫最后一次):
错误处理程序中的文件“/home/user/mypackage.py”行
返回函数(*args,**kwargs)
文件“/home/user/mypackagetest.py”,第行,以divnum表示
打印(1/num)
ZeroDivision错误:被零除
/home/user/mypackage.py((0,){})

print strError
与Python-3.x的使用不一致。您混淆了装饰的“开箱即用”创建和第三方库。它们相互干扰,只需坚持使用一个。另外:
如果_uname__=='\u u main__;'
很抱歉,我的代码不正确。我会小心的。我已经修复了它。另外:`>>divnum(0)回溯(最近一次调用):文件“/home/user/mypackage.py”,第8行,在错误处理程序return func(*args,**kwargs)文件“/home/user/mypackagetest.py”中,第5行,在divnum print(1/num)中,zeroditionError:division by zero/home/user/mypackage.py((0,{})`@bigmacd。你的意思是,当出现错误时,展示事情的进展情况是一个好主意吗?你说得对。@Kanak我意识到我想做的事。非常感谢。