Тут, наверное, надо бы сказать, почему positional-only arguments меня расстраивают. Меня как-то спрашивали, когда использовать keyword arguments, и я вот такое расписал:
Позиционные:
- Когда аргументы одного типа, и их порядок интуитивно понятен. Например,
shutil.copy(src, dst)
- Когда порядок аргументов не важен. Например,
sum(1, 2, 3)
- Когда аргументы одного типа и одного назначения. Например,
pyrsistent.PList(1, 2, 3)
- Когда аргумент один, и его назначение понятно. Например,
register(user)
. А вот так плохо:user.register(True)
, потому что непонятно, что это за True.
В остальных случаях всегда лучше передавать ключевые аргументы. Соответственно, в сигнатуре указывать их как keyword-only, чтобы об этом не забывать.
В общем, keyword аргументы почти всегда предпочтительнее, но теперь автор библиотеки сам будет решать, можно их использовать или нельзя. И если вам кажется, что это всегда будет мудрое решение, то нет.
И ещё один момент. Представьте, как вы объясняете прям совсем новичку, как вызывать функции и писать их стгнатуры. И вот вы рассказываете бедняге про positional arguments, keyword arguments, positional-only arguments, keyword-only arguments, default values, type annotations, args, kwargs, list unpacking, dict unpacking… “Python отличный язык для обучения, простой и понятный”, говорили они.