2016-04-04 7 views
3

Ich habe eine Python-Funktion (Python 2.5) mit einer Definition wie:Python ruft Positions Argument

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

Wo addl eine beliebige Anzahl von Strings sein kann (-Dateinamen) etwas damit zu tun.

Mir geht es gut mit allen Standardeinstellungen, aber ich habe Dateinamen in addl.

ich bin geneigt, etwas wie zu tun:

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

Aber das wird folgende Fehlermeldung:

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

Gibt es eine Syntax, wo ich kurz und bündigFoonur mit dem ersten aufrufen benötigter Parameter und meine (variable Anzahl von) zusätzlichen Strings? Oder bleibe ich redundant stecken alle Standardwerte, bevor ich in den addl Argument Bereich brechen kann?

Aus Gründen des Arguments kann die Funktionsdefinition nicht geändert oder refaktoriert werden.

+0

Einfach auspacken Tupel, sollte es funktionieren: Foo ('[email protected] '* ('File1.txt',' File2 .txt ')) – AndreyT

+2

@AndreyT: Das funktioniert nicht. Es weist "File1.txt" zu "a" und "File2.txt" zu "b" zu. – zondo

+1

Ja, hast du recht. Also, im Falle von 2.5 möglichen Lösung ist die Verwendung von Kwarts anstelle von b, c, d, e, f Parameter. – AndreyT

Antwort

2

Ok, wenn die Funktion kann nicht geändert werden, warum nicht Wrapper erstellen?

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

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

"Aus Gründen der Argumentation kann die Funktionsdefinition nicht geändert oder refaktoriert werden." – Kevin

+0

Ich habe die Antwort aktualisiert. – AndreyT

+0

'Foo.func_defaults' war das Schlüsselstück, das ich vermisste. Vielen Dank! – MellowNello

0

Nach meinem Wissen ist es nicht möglich.

Zuerst müssen Sie benötigt (a) und Standard (b, c, d, e, f) Argumente zu übergeben, und dann jedes zusätzliches Argument übergeben wird als * addl:

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

Ihre Antwort auf "gibt es eine Syntax, wo ich Foo mit nur dem ersten kurz und bündig anrufen kann benötigter Parameter und meine (variable Anzahl von) zusätzlichen Strings? " ist "nein"? Sind Sie sicher, dass dies der einzige Ansatz ist? – Kevin

+0

Entschuldigung, dass ich die Frage nicht genau beantworte. Nach meinem Wissen ist es nicht möglich. Ich werde meine Antwort bearbeiten. – apr

0

Sie versuchen addl als Schlüsselwort-Argument zu verwenden, aber Sie es als Positions Argument definiert. Sie sollten eine weitere * hinzufügen, wenn Sie die Funktion wie Foo(addl=('File1.txt', 'File2.txt')) nennen wollen:

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