hello([' 'hello([' '' 'whoopsthat' not quite what we expectedthe usual way to get around this is to make the default value noneand then use the idiom iargument argument if argument else [inside the method pay close attentionvariable argument lists default values alone do not allow us all the flexible benefits of method overloading the thing that makes python really slick is the ability to write methods that accept an arbitrary number of positional or keyword arguments without explicitly naming them we can also pass arbitrary lists and dictionaries into such functions for examplea function to accept link or list of links and download the web pages could use such variadic argumentsor varargs instead of accepting single value that is expected to be list of linkswe can accept an arbitrary number of argumentswhere each argument is different link we do this by specifying the operator in the function definitiondef get_pages(*links)for link in links#download the link with urllib print(linkthe *links parameter says " 'll accept any number of arguments and put them all in list named linksif we supply only one argumentit'll be list with one elementif we supply no argumentsit'll be an empty list thusall these function calls are validget_pages(get_pages('get_pages(''we can also accept arbitrary keyword arguments these arrive into the function as dictionary they are specified with two asterisks (as in **kwargsin the function declaration this tool is commonly used in configuration setups the following class allows us to specify set of options with default valuesclass optionsdefault_options