Python Click ライブラリを使用して、1 つのオプションが前のオプションによって設定された値に依存するコマンドを作成する慣用的な方法はありますか?
具体的な例 (私の使用例) は、コマンドがclick.File
入力としてタイプのオプションを受け取るだけでなく、入力ストリームのエンコーディングを指定するエンコーディング オプションも受け取ることです。
import click
@click.command()
@click.option("--encoding", type=str, default="utf-8")
@click.option("--input",
type=click.File("r", encoding="CAN I SET THIS DYNAMICALLY BASED ON --encoding?"))
def cli(encoding, input):
pass
callable を使用したある種の遅延評価が必要になると思いますが、現在の Click API でそれが可能かどうかはわかりません。
次の行に沿って何かできることがわかりました。
import click
@click.command()
@click.pass_context
@click.option("--encoding", type=str, default="utf-8")
@click.option("--input", type=str, default="-")
def cli(ctx, encoding, input):
input = click.File("r", encoding=encoding)(input, ctx=ctx)
str
しかし、オプションデコレータをそれに適用される意味的に正しい型制約から切り離し、代わりにダミーとしてそこに置くことは、どういうわけか読みにくく、保守しにくいと感じます。この2つを一緒に保つ方法があれば、私に教えてください。
提案された回避策:
click.File
タイプを2回使用して、デコレータで遅延させて、ファイルが実際に開かれたままにならないようにすることができると思います。
@click.option("--input", type=click.File("r", lazy=True), default="-")
これは意味的にはより満足のいくものですが、冗長でもあります。