2017-04-04 6 views
-1

私の問題は、dict(argparse)です。 flagに属性が1つしかない場合、パーサーはstringを返します。それ以外の場合はlistを返します。 私は基本的にパーサーを作っています。それは入力argsからコマンドを作成します。 例:文字列に文字列またはリスト変数のいずれかを追加する

kwargs = {-name: "MyName", tags: ["tag_1", "tag_2", "tag_3"] } 

必要な出力:

"--name Myname --tags tag_1 tag_2 tag3" 

私は一種ことを行うために管理が、私は、これは最適な方法だとは思わない:/

for k, v in kwargs.iteritems(): 
    if v is None: 
     continue 
    elif not isinstance(v, basestring): 
     print (v) 
     command = command+' {} '.format(k) + ' '.join(v) 
    else: 
     print (v) 
     command = command+' {} {}'.format(k, v) 

また、私は、このメソッドを使用しますargparse、feth値vars(argparse.parse_args())(これはこの質問の一部ではありませんが、誰かが知っているかもしれません)。 「 - 」その方法が有力行方不明続ける兆しを、私はそれらを持っているしたいのですが...たくさん:) 例:

--tag tag_1 tag_2 tag_3 

がに変換されます。

[tag: tag_1, tag_2, tag3] 
+0

'.add_argument()'の 'dest'キーワード引数を見てください。 – zondo

答えて

0

わからない私の場合あなたの質問を100%理解してください。次のようにあなたは、

kwargs = {"--name" : "MyName", "--tags" : ["tag_1", "tag_2", "tag_3"] } 

そのように辞書を使用することはできませんなぜ しかし、あなたのコマンドは、ご希望の出力を持つために

>>> command 
'your_command --name MyName --tags tag_1 tag_2 tag_3' 
+0

私はargparseを使用しているので、それは解析の方法が異なります。私の知る限りでは、構文解析の方法を変更するだけではありません。 https://docs.python.org/3/library/argparse.html – user2678074

0

になり、あなたはこのような何かを試すことができます。

kwargs = {'name': "MyName", 'tags': ["tag_1", "tag_2", "tag_3"] } 
final = "--{0} {1} --{2} {3}".format(list(kwargs.keys())[0], list(kwargs.values())[0], list(kwargs.keys())[1], " ".join(list(kwargs.values())[1])) 
print(final) 

出力:

'--name MyName --tags tag_1 tag_2 tag_3' 
+0

入力は大きく異なる場合があります。私はそれのために一般的なものが必要です。つまり、 'n'個のリスト要素と 'm'個のストリング要素だけが存在する可能性があります。それは辞書なので、順序も変わる可能性があります。 – user2678074

1

この機能は、あなたが望むものを作るん:キーに--を追加

def foo(adict): 
    alist = [] 
    for k,v in adict.items(): 
     k = '--'+k 
     if isinstance(v,list): 
      v = ' '.join([str(i) for i in v]) 
     else: 
      v = str(v) 
     alist.append('{} {}'.format(k,v)) 
    return ' '.join(alist) 

は自明です。私はそれが1つの文字キーにちょうど-を加えるようにそれを改良できると思います。残りの部分は、リスト(およびおそらく非ストリング値)が正しくフォーマットされていることを確認しています。

書式設定ですべての洗練を行うのは、​​またはその出力を直接調整するよりも簡単です。

In [38]: args = argparse.Namespace(name="MyName", tags=['tag1','tag2'], other=12) 
Out[39]: Namespace(name='MyName', other=12, tags=['tag1', 'tag2']) 
In [41]: vars(args) 
Out[41]: {'name': 'MyName', 'other': 12, 'tags': ['tag1', 'tag2']} 
In [42]: foo(vars(args)) 
Out[42]: '--tags tag1 tag2 --name MyName --other 12' 
+0

まあ、これは私がやったのとほとんど同じです( ' - 'マークを付けてください)。もしあなたがたぶん私が他のものと区別することなく文字列とリストのparamsを処理するための方法を知っていればもっと興味がありました。(例えば、raw文字列の代わりにargparseから一つの要素リストを持つ)スクリプトへの入力値を処理する(ただし、スクラッチから独自のクラスを作成することはできません)。私はあなたの助けに本当に感謝します、それはちょうど私が探しているものではありません。 – user2678074

関連する問題