Модуль проверки Python: ключевое слово только args

Фраза «ключевое слово только args» в Python немного неоднозначна – обычно я воспринимаю это как аргументы, переданные в параметр **kwarg . Тем не менее, модуль inspect похоже, делает различие между **kwarg и тем, что называется «ключевыми словами только аргументы».

Из документов :

inspect.getfullargspec (FUNC)

Получите имена и значения по умолчанию аргументов функции Python. Именованный кортеж возвращается:

FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)

args – список имен аргументов. varargs и varkw – это имена аргументов * и ** или None . defaults – это n-кортеж значений по умолчанию для последних n аргументов или None, если нет аргументов по умолчанию. kwonlyargs – это список имен аргументов только для ключевого слова. kwonlydefaults – это словарь, отображающий имена от kwonlyargs до kwonlyargs по умолчанию. annotations – это имена имен сопоставления словаря для аннотаций.

Таким образом, модуль проверки имеет что-то, называемое kwonlyargs и kwonlydefaults . Что это означает в фактической сигнатуре функции? Если у вас есть сигнатура функции, которая принимает аргумент **kwarg , вы не можете действительно знать имена аргументов ключевого слова до выполнения, потому что вызывающий может в принципе просто передавать любой произвольный словарь. Итак, какое значение имеет kwonlyargs в контексте сигнатуры функции – это то, что предоставляет inspect.getfullargspec .

One Solution collect form web for “Модуль проверки Python: ключевое слово только args”

TL; DR : аргументы только для ключевого слова не совпадают с аргументами обычного ключевого слова.


Ключевыми словами являются аргументы, которые появляются после *args и до **kwargs в вызове функции. В качестве примера рассмотрим этот общий заголовок функции:

 def func(arg, *args, kwonly, **kwargs): 

В приведенном выше случае kwonly принимает аргумент только для ключевого слова. Это означает, что вы должны указывать свое имя, когда даете ему значение. Другими словами, вы должны явно написать:

 func(..., kwonly=value, ...) 

вместо того, чтобы просто передать значение:

 func(..., value, ...) 

Чтобы лучше объяснить, рассмотрим этот примерный вызов функции, приведенной выше:

 func(1, 2, kwonly=3, kw=4) 

Когда Python интерпретирует этот вызов, он будет:

  • Назначьте arg 1 потому что его позиция в сигнатуре функции соответствует позиции 1 в вызове.

  • Поместите 2 в *args потому что *args собирает любые дополнительные позиционные аргументы, а 2 – дополнительно.

  • Назначьте kwonly на 3 потому что мы (как это необходимо) явно сказали ему. Обратите внимание, что если бы мы это сделали:

     func(1, 2, 3, kw=4) 

    3 также будет помещен в *args и TypeError будет поднят для того, чтобы не доставлять аргумент kwonly (так как мы не дали ему значение по умолчанию в этом случае).

  • Поместите kw=4 в **kwargs потому что это дополнительный аргумент ключевого слова, который собирается **kwargs .

Ниже приведена демонстрация того, что я сказал выше:

 >>> def func(arg, *args, kwonly, **kwargs): ... print('arg:', arg) ... print('args:', args) ... print('kwonly:', kwonly) ... print('kwargs:', kwargs) ... >>> func(1, 2, kwonly=3, kw=4) arg: 1 args: (2,) kwonly: 3 kwargs: {'kw': 4} >>> >>> func(1, 2, 3, kw=4) # Should have written: 'kwonly=3' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: func() missing 1 required keyword-only argument: 'kwonly' >>> 

В принципе, вы можете рассматривать аргументы только для ключевого слова как аргументы ключевого слова, где вы должны указывать имя параметра при предоставлении им значения. Позиционное значение будет недостаточным, как и для обычных аргументов ключевого слова.

 >>> def func(kw=None): ... print('kw:', kw) ... >>> func(kw=1) kw: 1 >>> func(1) # Do not need the name in this case. kw: 1 >>> >>> def func(*, kwonly=None): ... print('kwonly:', kwonly) ... >>> func(kwonly=1) kwonly: 1 >>> func(1) # Always need the name with keyword-only arguments. Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: func() takes 0 positional arguments but 1 was given >>> 

Наконец, я знаю, что некоторые люди думают: «Почему в любом случае есть аргументы только для ключевого слова?» Ответ просто в том, что они делают вещи более читаемыми в некоторых случаях (особенно с функциями, которые принимают переменное количество аргументов).

В качестве примера рассмотрим встроенную функцию max и key аргумент key . Что для вас более читаемо? Делать что-то вроде этого:

 max(lambda x: -x, arg1, arg2, arg3) 

и когда люди помнят, что первый аргумент max всегда является ключевой функцией или делает это:

 max(arg1, arg2, arg3, key=lambda x: -x) 

и давая понять всем, что lambda x: -x – ваша ключевая функция. Кроме того, при создании key аргумент только для ключевого слова позволяет просто опустить ключевую функцию, если она вам не нужна:

 max(arg1, arg2, arg3) 

вместо того, чтобы делать:

 max(None, arg1, arg2, arg3) 

Для получения дополнительной информации вы можете проверить эти источники:

  • Подавить / печатать без префикса b для байтов в Python 3
  • Количество строк в csv.DictReader
  • Копирование с числовой строкой
  • Выберите три разных значения из списка в Python
  • Как ввести 2 целых числа в одной строке в Python?
  • Python 3.3.2 проверить, что объект имеет тип файла
  • Отсутствует аргумент argpse в python 3
  • Как проверить дату в Python 3.x?
  • Python - лучший язык программирования в мире.