2017-11-22 13 views
-1

オリジナルのデコレータを元のパッケージ(例えば、 '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> 

のですか? 修正方法?

+1

は '印刷strError'は、Python-3.xのを用いてコヒーレントではありません。 – Kanak

+0

デコレーションの「すぐに使用できる」作成と[decorator.decorator](http://decorator.readthedocs.io/en/stable/tests.documentation.html#decorator-decorator)パーティーライブラリー。彼らはお互いに干渉し、ちょうど1つをつけます。 –

+0

また: 'if __name__ == '__main __'' – Martin

答えて

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,){}) 
+0

「 >>> divnum(0) トレースバック(最新のコール最後): ファイル "/home/user/mypackage.py"、error_handlerの8行目 return func(* args、** kwargs) ファイル "/home/user/mypackagetest.py"、行5、divnum print( 1/num) ゼロ除算エラー:ゼロ除算 /home/user/mypackage.py ((0、){}) ' – Martin

+0

@bigmacd。エラーが発生したときの状況を示すことは良い考えですか?あなたが正しいです。 – Kanak

+0

@Kanak私は自分がしたいことを実現しました。ありがとうございました – Ryohei

関連する問題