7

次のスタイルで引数を受け入れたい:

python3 test.py -r SERVICE=100,101,102 -r SERVICE2=1,2,3,4,5 
(-r REPO=REV#,REV#,etc... -r etc...)

これまでに次のことを行いました(引数-rを追加し、タイプrevsを定義しました)。2つのリストを返すことになっているため、問題が発生する可能性があります。

import argparse

def revs(s):
    try:            
        REPO, REVISIONS = map(str, s.split('='))
        REVISIONS = map(int, REVISIONS.split(','))
        return REPO, REVISIONS
    except:
        raise argparse.ArgumentTypeError("Must be format -r REPO=REV,REV,etc.. e.g. SERVICES=181449,181447") 

parser.add_argument('-r', type='revs', nargs='*', action='append', help='Revisions to update. The list is prefixed with the name of the source repository and a "=" sign. This parameter can be used multiple times.', required=True)

上記で実行すると、次のエラーが発生します。

Traceback (most recent call last):
File "test.py", line 11, in <module>
parser.add_argument('-r', type='revs', nargs='*', action='append', help='Revisions to update. The list is prefixed with the name of the source repository and a "=" sign. This parameter can be used multiple times.', required=True)
File "/usr/local/lib/python3.3/argparse.py", line 1317, in add_argument
raise ValueError('%r is not callable' % (type_func,))

ValueError:'revs'は呼び出せません

4

1 に答える 1

19

あなたが欲しい

parser.add_argument('-r', type=revs, ...)

いいえ

parser.add_argument('-r', type='revs', ...)

引数は呼び出し可能なオブジェクトである必要があります。type文字列は呼び出し可能ではないため、として使用することはできませんtype

于 2013-03-12T03:22:57.037 に答える