2016-04-04 3 views
3

У меня есть функция питона (Python 2.5) с определением типа:Python взывает позиционный аргумент

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

Где addl может быть любое количество строк (имена файлов), чтобы сделать что-то с.

Я в порядке со всеми значениями по умолчанию, но у меня есть имена файлов для ввода addl.

Я склонен сделать что-то вроде:

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

Но получает следующее сообщение об ошибке:

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

Есть ли синтаксис, где можно кратко назватьFooс только первым требуемый параметр и мое (переменное число) дополнительных строк? Или я застреваю с избыточным указанием всех значений по умолчанию, прежде чем я смогу переломить диапазон аргументов addl?

Для аргументации определение функции не может быть изменено или реорганизовано.

+0

Просто распаковать кортеж, он должен работать: Foo ('[email protected] «* („FILE1.TXT“,» File2 .txt ')) – AndreyT

+2

@AndreyT: Это не работает. Он присваивает '' File1.txt'' 'a' и' 'File2.txt''' ''. – zondo

+1

Да, ты прав. Таким образом, в случае 2.5 возможного решения используется использование kwargs вместо b, c, d, e, f параметров. – AndreyT

ответ

2

Хорошо, если функция не могут быть изменены, то почему бы не создать оболочку?

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

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

«Для аргументации определение функции не может быть изменено или реорганизовано». – Kevin

+0

Я обновил ответ. – AndreyT

+0

'Foo.func_defaults' был ключевым элементом, который мне не хватало. Благодаря! – MellowNello

0

Насколько мне известно, это невозможно.

Сначала вам нужно пройти необходимый (а) и по умолчанию (B, C, D, E, F) аргументы, а затем каждый дополнительный аргумент передается как * приставной:

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

Итак, ваш ответ на «есть синтаксис, где я могу лаконично вызвать Foo только с первого требуемый параметр и мое (переменное число) дополнительных строк? " нет"? Вы уверены, что это единственный подход? – Kevin

+0

Извините за то, что я точно не ответил на вопрос. Насколько мне известно, это невозможно. Я отредактирую свой ответ. – apr

0

Вы пытаетесь использовать addl в качестве ключевого слова аргумент, но вы определили его в качестве позиционного аргумента. Вы должны добавить еще один * если вы хотите, чтобы вызвать функцию как Foo(addl=('File1.txt', 'File2.txt')):

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

 Смежные вопросы

  • Нет связанных вопросов^_^