2017-06-01 89 views
0

我在spyder中使用Python 2.7.13。語法錯誤:關鍵字arg後的非關鍵字arg

def test(a,b,c='c',*args): 
    for item in args: 
     print item 

這個函數定義是有效的Python 2.7,但只要我嘗試在args將它傳遞給我的非關鍵字ARG關鍵字ARG後錯誤:

test(1,2,c='c',10,11) 

給出了這樣的:

non-keyword arg after keyword arg 

但這:

test(1,2,3,4,5) 

正在工作。

我不知道有什麼問題在這裏,因爲把*args bfore c='c'

def test(a,b,*args,c='c'): 
    for item in args: 
     print item 

這使我在函數定義的錯誤。

上面的代碼僅僅是一個虛擬實例的原代碼如下所示:

def export_plot_as_mat(fname, undersamp, undersamp_type, n_comp, b_s, n_iter, fit_alg, transf_alg, alpha_train, alpha_test, export_info=False, *args): 

    info = ('undersampling=' + str(undersamp) + ' undersampling_type=' +str(undersamp_type) + 
     ' n_comp=' + str(n_comp) + ' batch_size=' + str(b_s) + 
     ' n_iter=' + str(n_iter) + ' fit_alg=' + str(fit_alg) + 
     ' transform_alg=' + str(transf_alg) + ' alpha_train=' + 
     str(alpha_train) + ' alpha_test=' + str(alpha_test)) 

    d = [(str(args[i]), args[i]) for i in range(len(args))] 

    if export_info: 
     d.append('info',info) 
    sp.io.savemat(fname + '.mat', d) 

我希望有出口用於構建我導出數據的參數選項。

+0

更改順序:'test(1,2,10,11,c ='c')'。 Python會做正確的事情,並在'* args'中收集所有非關鍵字參數。 – Boldewyn

+0

@Boldewyn這可能工作在python 3.x,但在Python 2.7這給了我錯誤'測試()有多個值的關鍵字參數'c'' –

+0

@PedrovonHertwig我希望參數有不同的大小,所以這就是爲什麼我只是不要傳遞一個常規參數 –

回答

1

定義很好,因爲c可以在位置上指定。 致電是問題;您在另一個位置參數之前指定了關鍵字參數。

Python 2.x沒有定義關鍵字參數的方法。

+0

相矛盾,將* args放在關鍵字之前會在函數定義中產生錯誤 –

+0

是的,那是第二個錯誤。它並沒有改變第一個定義是好的事實。 – chepner

+0

無論您如何在Python 2.x中定義'test',像'test(1,2,c = 3,4,5)'這樣的調用都是非法的;您不能在關鍵字參數之後指定位置參數。 – chepner

0

這裏有一些東西。

改變時在測試中c = 'c'()僅僅'c'

也ü可以把你的最後一個參數列表中的打印他們在同一行。或者將它們保持原樣打印在不同的行中。

def test(a,b,c='c',*args): 
    for item in args: 
     print item 

test(1,2,'c',[10,11]) 

結果:

[10, 11] 

對於參數c = 'c'你可以傳給你想有什麼與c互動:

拿這個例子:

def test(a,b,c='c',*args): 
    print c 
    for item in args: 
     print item 


test(1,2,'g',10,11) 

結果:

g 
10 
11 
+0

我想指定'c'作爲c ='c'來查看'c'分配的內容 –

+0

你能多一點明確這一點?你是什​​麼意思,看看分配了什麼'c'。也許在'='兩邊使用一個不是'c'的例子,這樣我就能理解你需要什麼。 –

+0

在更新後的問題中,參數是'export_info = False',因此在函數調用中它可以被顯示,也可以導出信息或者僅僅輸出參數。只是傳遞'True'或'False'不可讀imo –

0

這是Python 2.x如何進行參數解析的一個有趣的案例。粗略地說,Python具有一些邏輯,用於將傳遞給函數的參數與它所期望的參數進行「匹配」,並在Python 3中更改此邏輯。

獲得所需內容的最簡單方法是接受**kwargs而不是指定c=0,然後手動執行默認參數。

+0

我認爲這是一個解決方案,但最終它有點難看。定義與上述函數調用本身 –

相關問題