argparse:ユーザー入力を定義された定数にマップします

YSC

parser.add_argument(...)コードで定義された定数を使用して、指定された引数をマップするように作成したいと思います。

私が次のものを持っているとしましょう

import argparse

# Both are the same type
CONST_A = <something>
CONST_B = <otherthing>

parser = argparse.ArgumentParser()
parser.add_argument(...)

# I'd like the following to be true:
parser.parse_args("--foo A".split()).foo == CONST_A
parser.parse_args("--foo B".split()).foo == CONST_B

代わりに何を置くことができ...ますか?


私ができる最善のことconstは:

import argparse

# Both are the same type
CONST_A = 10
CONST_B = 20

parser = argparse.ArgumentParser()
status_group = parser.add_mutually_exclusive_group(required=True)
status_group.add_argument("-a", const=CONST_A, action='store_const')
status_group.add_argument("-b", const=CONST_B, action='store_const')

# I'd like the following to be true:
print parser.parse_args("-a".split()).a == CONST_A # True
print parser.parse_args("-b".split()).b == CONST_B # True

定数はTWのodifferent属性に保存されていることを注意aしてbいない、魔女のスーツ私:(

Tadhgマクドナルド-ジェンセン

最も簡単な方法は、@ hpauljが行っtype=add_argumentようにオプションを利用することですが、ファクトリ関数で一般化することもできます。

def argconv(**convs):
    def parse_argument(arg):
        if arg in convs:
            return convs[arg]
        else:
            msg = "invalid choice: {!r} (choose from {})"
            choices = ", ".join(sorted(repr(choice) for choice in convs.keys()))
            raise argparse.ArgumentTypeError(msg.format(arg,choices))
    return parse_argument

次に、...単に使用する代わりにtype=argconv(A=CONST_A, B=CONST_B)

parser.add_argument("--foo", type=argconv(A=CONST_A, B=CONST_B))

そして、すべてがあなたの例で望むように機能します。


以下は私が投稿した最初の回答です。それはまだ有効ですが、上記の解決策ほど単純ではありません。

別の方法は、結果を継承しargparse.ArgumentParserてオーバーライドするクラスを作成し、parse_args生成された結果を変更することです。

import argparse

class MappedParser(argparse.ArgumentParser):
    mapping = {} #backup if you don't use def_mapping

    def def_mapping(self,**options):
        self.mapping = options

    def parse_args(self,args=None,namespace=None):
        result = argparse.ArgumentParser.parse_args(self,args,namespace)
        for name,options in self.mapping.items(): #by default this is is empty so the loop is skipped
            if name in result:
                key = getattr(result,name)
                if key in options:
                    replace_with = options[key]
                    setattr(result,name,replace_with)
                else:
                    self.error("option {name!r} got invalid value: {key!r}\n must be one of {valid}".format(name=name,key=key,valid=tuple(options.keys())))
                    return #error should exit program but I'll leave this just to be safe.
        return result

このようにして、(例の)プログラムの残りの部分は次のようになります。

# There is nothing restricting their type.
CONST_A = "<something>"
CONST_B = ["other value", "type is irrelevent"]

parser = MappedParser() #constructor is same

parser.def_mapping(foo={"A":CONST_A, "B":CONST_B})

parser.add_argument("--foo") # and this is unchanged

# the following is now true:
print(parser.parse_args("--foo A".split()).foo is CONST_A)
print(parser.parse_args("--foo B".split()).foo is CONST_B)
#note that 'is' operator works so it is even the same reference

#this gives decent error message
parser.parse_args("--foo INVALID".split())

print("when parser.error() is called the program ends so this never is printed")

次のようなオプションを追加します。

parser.def_mapping(foo={"A":CONST_A, "B":CONST_B,"C":"third option"})

または次のような追加の引数:

parser.def_mapping(foo={"A":CONST_A, "B":CONST_B},
                   conv={"int":int,"float":float})

また、で指定されていない追加の引数はそのdef_mappingままにしておくので、実装は非常に簡単です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

AngularJSは、事前定義されたユーザーの座標をマップ上に表示します

分類Dev

ユーザー入力を待つか、定義された間隔で実行するプログラム?

分類Dev

csvで定義されたユーザーを実行します。スレッドグループで定義されたループの数-Jmeter

分類Dev

ネストされたスキーマを定義します。入力を入力すると、何も返されず、Mongodbに保存されません。

分類Dev

生成されたユーザー名をDjangoユーザー名フィールドに入力します

分類Dev

値が設定される前に、ユーザーコントロールのドロップダウンにデータを入力します

分類Dev

長さが不明なJSONユーザー入力を適切にフォーマットされたhtmlに変換しますか?

分類Dev

ユーザーの入力ポイントから定義された距離(メートル)でGoogleマップにポリゴン(長方形)を描画する方法

分類Dev

ユーザー定義関数VBAの自動入力を下にドラッグします

分類Dev

入力されたとおりにコンソールユーザー入力を取得します。

分類Dev

定義する前に、ネストされたユーザー定義関数を呼び出します

分類Dev

ユーザー入力でGoogleマップを住所に設定する方法

分類Dev

ループで定義されたセルに、VBAのループで開かれたユーザーフォームに入力されたテキストを入力する方法

分類Dev

Java:ユーザーが新しい値を入力するたびに入力された一意の値の完全なセットを表示します

分類Dev

jquery-ユーザーがキーアップではなく入力を終了したときにユーザーの入力を出力しますか?

分類Dev

TEXT入力を使用したユーザー定義関数

分類Dev

Clojure:ユーザー入力からマップを作成します

分類Dev

localStorageを使用して、ユーザーがdiv contenteditableと設定された色に入力したものを保存できますか?

分類Dev

WatsonAssistantによる事前定義されたユーザー入力

分類Dev

ユーザー入力で定義された長さの静的配列を作成するにはどうすればよいですか?

分類Dev

ExcelVBA-ユーザーフォームに入力された文字列を数値に変換します

分類Dev

intと入力されたユーザーのMSBとLSBを出力します

分類Dev

Python:廃止されたユーザー入力を排除します

分類Dev

スキャナーはユーザーが入力した整数を受け取り、次に文字列の配列を受け取りますが、最初に入力された文字列をスキップします

分類Dev

データがユーザーまたはマクロ[VBA]によって入力されたかどうかを確認します

分類Dev

Javascript:ユーザー入力を定義リストと比較します

分類Dev

Angular4のユーザー入力によって定義されたカスタムCSSを追加するにはどうすればよいですか?

分類Dev

事前入力されたデータをユーザー入力と比較し、編集されている場合にのみフォームを送信します

分類Dev

正しい入力が受信されるまで、誤ったユーザー入力を無視します

Related 関連記事

  1. 1

    AngularJSは、事前定義されたユーザーの座標をマップ上に表示します

  2. 2

    ユーザー入力を待つか、定義された間隔で実行するプログラム?

  3. 3

    csvで定義されたユーザーを実行します。スレッドグループで定義されたループの数-Jmeter

  4. 4

    ネストされたスキーマを定義します。入力を入力すると、何も返されず、Mongodbに保存されません。

  5. 5

    生成されたユーザー名をDjangoユーザー名フィールドに入力します

  6. 6

    値が設定される前に、ユーザーコントロールのドロップダウンにデータを入力します

  7. 7

    長さが不明なJSONユーザー入力を適切にフォーマットされたhtmlに変換しますか?

  8. 8

    ユーザーの入力ポイントから定義された距離(メートル)でGoogleマップにポリゴン(長方形)を描画する方法

  9. 9

    ユーザー定義関数VBAの自動入力を下にドラッグします

  10. 10

    入力されたとおりにコンソールユーザー入力を取得します。

  11. 11

    定義する前に、ネストされたユーザー定義関数を呼び出します

  12. 12

    ユーザー入力でGoogleマップを住所に設定する方法

  13. 13

    ループで定義されたセルに、VBAのループで開かれたユーザーフォームに入力されたテキストを入力する方法

  14. 14

    Java:ユーザーが新しい値を入力するたびに入力された一意の値の完全なセットを表示します

  15. 15

    jquery-ユーザーがキーアップではなく入力を終了したときにユーザーの入力を出力しますか?

  16. 16

    TEXT入力を使用したユーザー定義関数

  17. 17

    Clojure:ユーザー入力からマップを作成します

  18. 18

    localStorageを使用して、ユーザーがdiv contenteditableと設定された色に入力したものを保存できますか?

  19. 19

    WatsonAssistantによる事前定義されたユーザー入力

  20. 20

    ユーザー入力で定義された長さの静的配列を作成するにはどうすればよいですか?

  21. 21

    ExcelVBA-ユーザーフォームに入力された文字列を数値に変換します

  22. 22

    intと入力されたユーザーのMSBとLSBを出力します

  23. 23

    Python:廃止されたユーザー入力を排除します

  24. 24

    スキャナーはユーザーが入力した整数を受け取り、次に文字列の配列を受け取りますが、最初に入力された文字列をスキップします

  25. 25

    データがユーザーまたはマクロ[VBA]によって入力されたかどうかを確認します

  26. 26

    Javascript:ユーザー入力を定義リストと比較します

  27. 27

    Angular4のユーザー入力によって定義されたカスタムCSSを追加するにはどうすればよいですか?

  28. 28

    事前入力されたデータをユーザー入力と比較し、編集されている場合にのみフォームを送信します

  29. 29

    正しい入力が受信されるまで、誤ったユーザー入力を無視します

ホットタグ

アーカイブ