更新バージョンにアップグレードする

クリックは最高レベルの後方互換性を試みるが,完全には不可能な場合がある.後方互換性を破壊する必要がある場合、本文書では、後方互換性をどのように正確にアップグレードまたは処理するかに関する情報を提供します。

7.0にアップグレード

修飾関数に命名された命令は,現在下線を破折番号に置き換えている.例えばPython関数は run_server コマンド名を取得します run-server 今行きます。この問題を解決できるいくつかの選択肢があります

  • 新しい行動を続けるためには、依存項を固定してください Click>=7 破壊番号を使用するためにすべての文書を更新します。

  • 既存の行為を保留するためには、下線付きの明示的なコマンド名を追加してください。 @click.command("run_server") それがそうです。

  • 下線のついた名前が見つからない場合は、破れた番号のついた名前を使ってみてください。 token_normalize_func 文脈によると:

    def normalize(name):
        return name.replace("_", "-")
    
    @click.group(context_settings={"token_normalize_func": normalize})
    def group():
        ...
    
    @group.command()
    def run_server():
        ...
    

3.2にアップグレードする

Click 3.2は複数のコマンドに対して2回の変更を実行しなければならず,この2つの変更はClick 2とClick 3の間の変更によってトリガされ,結果は予想以上に深刻である.

文脈呼び出し.

Click 3.2はペアを含む Context.invoke() 関数は他の命令とともに使用する際に用いる.この関数の初心は,関数ではなく別の命令にコンテキストオブジェクトを渡す際に,命令行からのようにその命令を呼び出すことである.この用法は従来文書中の1つの位置でのみ説明されており,API文書ではこの方法を適切に解釈していない.

核心的な問題は、バージョン3.2の前に、この要求が人々の意図に反していることだ。

ctx.invoke(other_command, 'arg1', 'arg2')

Clickがパラメータを操作することを許さないので、これは機能するつもりはない。このパターンは記録されておらず意図が悪いため,誤った修復バージョンでこの行為を変更することにし,意外に伝播しないように開発者が依存することにした.

上記の命令の正しい呼び出しは以下のとおりである.

ctx.invoke(other_command, name_of_arg1='arg1', name_of_arg2='arg2')

これはまた、この関数がデフォルト設定の問題を正しく処理していないことを修復することを可能にする。

マルチコマンドリンクAPI

3をクリックしてマルチコマンドリンクを紹介します。これはClickの内部発送方法を変更する必要がある。残念ながら、この変更は正しく実現されておらず、スーパーコマンドが呼び出されるすべてのサブコマンドを通知するためのAPIを提供することができるように見える。

しかしながら、この仮定は、過去に与えられたAPI保証のうちの1つには適用されない。したがって,この機能は破壊されているため3.2で削除されている.代わりに事故で壊れたのは Context.invoked_subcommand 属性は復元された.

どのような適切なコマンドが呼び出されるかを知る必要がある場合、この問題を解決するための異なる方法があります。第1の方法は,子命令をすべて関数に返させ,それを呼び出すことである. Context.resultcallback() それがそうです。

2.0にアップグレードする

Click 2.0はパラメータコールバックの署名である画期的な変更を持っている。2.0までにコールバックは (ctx, value) そして今は (ctx, param, value) それがそうです。この変更は必要であり、そうでなければ再使用コールバックを複雑にしすぎる。

移行を単純化するために、Clickはまだ古いコールバックを受け入れるだろう。Click 3.0から、stderrに警告を出し始め、アップグレードを奨励します。

Click 1.0とClick 2.0を同時にサポートしたい場合は、署名を調整するための簡単な修飾子を作成することができます:

import click
from functools import update_wrapper

def compatcallback(f):
    # Click 1.0 does not have a version string stored, so we need to
    # use getattr here to be safe.
    if getattr(click, '__version__', '0.0') >= '2.0':
        return f
    return update_wrapper(lambda ctx, value: f(ctx, None, value), f)

このブースターがあれば、以下のようなコードを書くことができます。

@compatcallback
def callback(ctx, param, value):
    return value.upper()

Click 1.0には転送パラメータがないので注意してください param ここでの論点は None したがって,互換性コールバックはこのパラメータを使用することができない.