2017-04-04 77 views
-1

我的問題是,我有字典(argparse)。如果標誌只有一個屬性,解析器將返回字符串,否則列表。 我基本上是解析器,它將從輸入參數創建命令。 例子:附加到字符串或字符串或列表變量

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) 

而且我用這個方法(這不是這個問題的一部分,但也許有人知道)。這樣不斷丟失的前導「 - 」跡象,但我想有他們...很多:) 例子:

--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) 

添加--的關鍵是微不足道的。我想你可以對它進行改進,以便它僅將-添加到單個字符鍵。其餘的是確保列表(也可能是非字符串值)格式正確。

做格式化的所有細化比直接調整​​或它的輸出要容易得多。

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

好吧,這與我做的非常相似(除了添加' - '標記)。我更好奇,如果你可能知道如何獲得'原始'字典形式argparse,或者處理字符串和列表參數而不區分另一個(例如,從argparse而不是原始字符串中獲取一個元素列表),或者某種用於處理腳本輸入值的替代方法(但不能從頭開始創建自己的類)。我非常感謝你的幫助,但這不僅僅是我所期望的。 – user2678074