*args
предназначен для получения всех аргументов, которые не уже приняты обычными аргументами.
Обычно, если вам нужен обязательный аргумент, вы просто используете обычный аргумент:
>>> def foo(arg, *rest):
... print arg, rest
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() takes at least 1 argument (0 given)
Если вы считаете более элегантным собрать все аргументы в кортеже, вы должны обработать случай ошибки самостоятельно:
>>> def foo(*args):
... if len(args) < 1:
... raise TypeError('foo() takes at least 1 argument (%i given)' % len(args))
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in foo
TypeError: foo() takes at least 1 argument (0 given)
Но, как вы можете (или должны) видеть, из подписи этой функции не ясно, сколько аргументов этой функции является обязательным для любого, кто использует эту функцию. Вам следует либо вообще этого избегать, либо, по крайней мере, задокументировать это очень хорошо.
Есть и другие проблемы: если вы дадите аргумент для foo()
, который является итеративным (как строка), вы не получите ожидаемый результат.
Отвечая на ваш комментарий ниже, ваш первый подход был правильным: возьмите список.
def scrape(urls):
for url in urls:
do_something(url)
Вызывающий просто должен передать список только с одним элементом: scrape(['localhost'])
.
Еще лучше, вероятно, взять только один URL-адрес и позволить вызывающей стороне перебирать список. В этом случае вызывающая сторона может распараллелить операции, если она когда-либо захочет.
Что касается вашего второго вопроса 1 : либо ваша функция принимает список в качестве аргумента, либо нет. Либо в вашей программе имеет смысл передавать списки, либо нет.
Думаю, я не совсем уверен, о чем вы там спрашиваете, но опять же весь ваш вопрос звучит так, как будто вы нашли новый блестящий инструмент, и теперь вы хотите использовать его везде, независимо от того, имеет ли он смысл или нет.
1 пожалуйста, не задавайте более одного вопроса одновременно!