6

ライブラリを使用していますが、 fromClickに似た動作が見つからないようです。destargparse

たとえば、私は

@click.option('--format', type=click.Choice(['t', 'j']))
def plug(format):
  pass

理想的ではない--format組み込みの Python コンストラクトに変換されるフラグを使用していることに注意してください。format

オプションのクリック関数に渡される引数を変更する方法はありますか?

4

2 に答える 2

9

には と同等のClickものはありませんが、悪用できる特定の引数命名動作があります。具体的には、複数の可能な名前を持つパラメーターの場合、破線のない名前が優先され、2 番目の優先順位として、短い名前よりも長い名前が優先されます。destargparse

URL: http://click.pocoo.org/dev/parameters/#parameter-names

したがって、オプションを次のように宣言すると...

@click.option('--format', 'not-format', type=click.Choice(['t', 'j']))

...次にクリックすると、破線以外のバリアント ( 'not-format') が優先され、引数を指定して関数が呼び出されますnot_format=...

もちろん、この代替スペルはコマンド ラインでも使用できることも意味します。それが望ましくない場合は、デコレータを追加してキーワード引数の名前を変更できると思います。

import functools

def rename_kwargs(**replacements):
    def actual_decorator(func):
        @functools.wraps(func)
        def decorated_func(*args, **kwargs):
            for internal_arg, external_arg in replacements.iteritems():
                if external_arg in kwargs:
                    kwargs[internal_arg] = kwargs.pop(external_arg)
            return func(*args, **kwargs)
        return decorated_func
    return actual_decorator

テスト コード:

if __name__ == '__main__':

    @rename_kwargs(different_arg='format')
    def tester(different_arg):
        print different_arg

    tester(format='test value')

テスト出力:

$ python test_decor.py
test value

あなたの場合、次のようになります。

@click.option('--format', type=click.Choice(['t', 'j']))
@replace_kwargs(not_format='format')
def plug(not_format):
    pass
于 2016-02-23T09:49:34.200 に答える