Python 如何在我的软件包中使用decorator
我想在我的原始包中使用原始decorator(例如,“mypackage”中的“with_error_handler”)并执行一些函数。 但它返回的函数对象或错误信息也是给定的参数 在我的包中: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)
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我意识到我想做的事。非常感谢。