2017-02-28 6 views
0

ライブラリの新しいバージョンでの作業いくつかの関数のデフォルト引数の1つを変更します。だから私は、明示的に指定されたパラメータなしで関数を呼び出すときに発生する一時的な警告を追加したいと思います(関数はデフォルトで呼び出されます)。関数の特定の引数を変更するデコレータ

これは、簡単に警告機能を追加し、基本機能のそれぞれの内側にそれを呼び出すことによってだけ行うことができます。

def warning(formatting): 
    if formatting is None: 
     sys.stderr.write("WARNING: The default format has changed to new_format") 
     return 'new_format' 
    return formatting 

def my_function(arg1, arg2, formatting=None): 
    formatting = warning(formatting) 
    ... # the following function code 

(コードの可読性のために)デコレータを使用してそれを実行する方が便利だろうが。 formattingは、キーワードパラメータとして指定されている場合、私はformattingパラメータなしmy_functionを呼び出すとすると、期待どおりに動作し

def check_default_format(fun): 
    def warning(*a, **kw): 
     if 'formatting' not in kw.keys() or kw['formatting'] is None: 
      kw['formatting'] = 'new_format' 
      sys.stderr.write("WARNING: The default format has changed to new_format") 
     return fun(*a, **kw) 
    return warning 

@check_default_format 
def my_function(arg1, arg2, formatting=None): 
    ... # the function code 

:だから私はこのような何かを実装しました。 しかし、位置パラメータだけでmy_functionを呼び出すことができる可能性をどのように含めるには? my_function('arg1', 'arg2', 'some_format')を呼び出すと、formattingパラメータの重複によってTypeErrorが生成されます。

注:異なる機能を装飾する必要があるため、formattingは常に第3パラメータであるとは思えません。下位互換性を保つために、パラメータの順序を変更することもできません。 python 3では

+0

formatting' 'のデフォルト値は常に' NONE'でしょうか? –

+0

有効なデフォルトの書式設定は(常に) 'new_format'です。ユーザが 'new_format'を暗黙的に指定したかどうか、または関数がデフォルトで呼び出されたかどうかを判断するために、関数宣言で(常に) 'None'に設定されています。 – Dado

答えて

1

、あなたは検査モジュールのSignature.bind_partialを使用することができます。

def check_default_format(fun): 
    @wraps(fun) 
    def wrapper(*a, **kw): 
     sig= inspect.signature(fun) 
     args= sig.bind_partial(*a, **kw) 

     if 'formatting' not in args.arguments or args.arguments['formatting'] is None: 
      kw['formatting'] = 'new_format' 
      sys.stderr.write("WARNING: The default format has changed to new_format") 
     return fun(*a, **kw) 
    return wrapper 
関連する問題