Хоча більшість відповідей говорить, що, наприклад,
def f(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...etc...
є "те саме, що"
def f(foo=None, bar=None, **kwargs):
...etc...
це не правда. В останньому випадку f
можна називати як f(23, 42)
, тоді як перший випадок приймає лише названі аргументи - відсутні позиційні виклики. Часто ви хочете дозволити абоненту максимальну гнучкість, і тому друга форма, як стверджує більшість відповідей, є кращою: але це не завжди так. Коли ви приймаєте безліч необов’язкових параметрів, з яких зазвичай передаються лише декілька, це може бути чудовою ідеєю (уникати аварій та нечитабельного коду на ваших сайтах викликів!), Щоб змусити використовувати названі аргументи - threading.Thread
це приклад. Перша форма полягає в тому, як ви реалізуєте це в Python 2.
Ідіома настільки важлива, що в Python 3 тепер вона має спеціальний підтримуючий синтаксис: кожен аргумент після одиниці *
в def
підписі є лише ключовим словом, тобто не може передаватися як позиційний аргумент, а лише як названий. Отже, в Python 3 ви можете кодувати вищезгадане як:
def f(*, foo=None, bar=None, **kwargs):
...etc...
Дійсно, в Python 3 ви навіть можете мати аргументи лише для ключових слів, які не є необов'язковими ( аргументи без значення за замовчуванням).
Однак у Python 2 попереду довгі роки продуктивного життя, тому краще не забувати про методи та ідіоми, які дозволяють вам реалізувати в Python 2 важливі дизайнерські ідеї, які безпосередньо підтримуються мовою в Python 3!