2016-04-04 13 views
3

seslendiğini: addl bir şeyler yapmak dizeleri herhangi bir sayıda (dosya adları) olabilirPython gibi bir tanımla (piton 2.5) Bir piton fonksiyonu var pozisyonel argüman

def Foo(a, b='Silly', c='Walks', d='Spam', e='Eggs', f='Ni', *addl): 

.

Tüm varsayılanlarla iyiyim, ancak addl içine koymak için dosya adlarım var.

ben böyle bir şey yapmak eğilimindeyim:

Foo('[email protected]', addl=('File1.txt', 'File2.txt')) 

Ama bu şu hatayı alır:

TypeError: Foo() got an unexpected keyword argument 'addl' 

ben kısaca sadece ilk olanFoodiyebileceği bir sözdizimi var mı gerekli parametre ve (değişken sayıda) ek dizelerim? Veya addl bağımsız değişken aralığına girmeden önce tüm varsayılanları belirterek gereksiz yere sıkışmış mıyım?

Bağımsız değişken için, işlev tanımı değiştirilemez veya yeniden yüklenemez.

+0

Sadece çalışmalı, tuple paketten: Foo ('[email protected] '* ('file1.txt File2',' sen Foo(addl=('File1.txt', 'File2.txt')) gibi işlevi çağırmak istiyorsanız * bir daha eklemek gerekir .txt ')) – AndreyT

+2

@AndreyT: Bu işe yaramıyor. '' Dosya1.txt '' a a 've' File2.txt ''' 'a' a atar. – zondo

+1

Evet, haklısın. Yani, 2.5 olası çözüm durumunda b, c, d, e, f parametreleri yerine kwargs kullanılır. – AndreyT

cevap

2

Ok, fonksiyon eğer değiştirilemez, o zaman neden sarıcı oluşturmuyorsunuz?

def foo_with_defaults(a, *addl): 
    Foo(a, *(Foo.func_defaults + addl)) 

foo_with_defaults('[email protected]', *('File1.txt', 'File2.txt')) 
+3

"Bağımsız değişken için, işlev tanımı değiştirilemez veya yeniden oluşturulamaz." – Kevin

+0

Cevabı güncelledim. – AndreyT

+0

'Foo.func_defaults', eksik olduğum anahtar parçaydı. Teşekkürler! – MellowNello

0

Bilgim olsun, bu mümkün değil.

Önce gerekli (a) ve varsayılan geçmesi gerekiyor (b, c, d, e, f) argümanlar, ardından her ek argüman olarak geçirilir * addl:

Foo('[email protected]', 'Silly', 'Walks', 'Spam', 'Eggs', 'Ni', 'File1.txt', 'File2.txt') 
+2

Yani cevabınız "sadece birincisi ile Foo'yu çağırabileceğim bir sözdizimi var mı? gerekli parametre ve (değişken sayıda) ek dizelerim? " "hayır" mı? Bunun tek ve tek yaklaşım olduğuna emin misin? – Kevin

+0

Soruyu tam olarak cevaplamadığım için üzgünüm. Bilgime göre bu mümkün değil. Cevabımı düzenleyeceğim. – apr

0

Bir anahtar kelime argüman olarak addl kullanmaya çalışıyor, ancak bir pozisyonel argüman olarak tanımlanır.

def Foo(a, b='Silly', c='Walks', d='Spam', e='Eggs', f='Ni', **addl):