Тут, наверное, надо бы сказать, почему positional-only arguments меня расстраивают. Меня как-то спрашивали, когда использовать keyword arguments, и я вот такое расписал:

Позиционные:

  1. Когда аргументы одного типа, и их порядок интуитивно понятен. Например, shutil.copy(src, dst)
  2. Когда порядок аргументов не важен. Например, sum(1, 2, 3)
  3. Когда аргументы одного типа и одного назначения. Например, pyrsistent.PList(1, 2, 3)
  4. Когда аргумент один, и его назначение понятно. Например, 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 отличный язык для обучения, простой и понятный”, говорили они.