Что означает «[» после аргумента в функции вызова в Python?

Я просматривал вики opencv и наткнулся на функцию resize, определенную как:

dst = resize( src, dsize[, dst[, fx[, fy[, interpolation]]]] )

Я не могу понять, что означает [ после аргументов.

Я предполагал, что это означает необязательный аргумент, но понял, что это не так, поскольку dsize является обязательным аргументом.

Любые разъяснения очень помогут.

Аргументы в [] являются необязательными, dsize не заключены в скобки.

Michael Butscher 12.06.2024 06:35

Хорошо, это имеет смысл. Большое спасибо! Но если мы посмотрим на это с такой точки зрения, то зачем нужны запятые в скобках?

Anjishnu 12.06.2024 06:39

Запятые — это просто разделители для наглядности. По мере того, как вы будете использовать больше библиотек и инструментов, вы заметите, что это общепринятое соглашение.

s3dev 12.06.2024 06:40

@s3dev Есть ли где-нибудь в Интернете место, где можно узнать больше об этих вариантах дизайна?

Anjishnu 12.06.2024 06:44

Оно происходит от Бэкуса-Наура-Формы, способа описания грамматик языков программирования. Поскольку это вопрос грамматики, а запятые являются частью грамматики, они заключаются таким образом.

Michael Butscher 12.06.2024 06:46

Запятые — это не просто разделители для наглядности. Они являются частью синтаксиса. Лучше думать об этом так: вы можете отбросить все, что заключено в пару совпадающих скобок, и получить правильный синтаксис функции. Это означает, что resize(src, dsize) допустимо, поскольку его можно получить, отбросив все, что заключено в крайнюю пару скобок. resize(src, dsize, dst) также допустимо и может быть получено путем отбрасывания следующей внешней пары скобок, но не resize(src, dsize, fx). Вы должны концептуально группировать вещи в квадратных скобках и воспринимать запятую буквально.

Weijun Zhou 12.06.2024 07:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
113
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Квадратные скобки [] в документации OpenCV обычно обозначают необязательные аргументы. Однако в случае с сигнатурой функции resize(), которую вы предоставили, это немного сбивает с толку, потому что dsize действительно является обязательным аргументом, как вы правильно заметили.

Квадратные скобки используются для обозначения необязательных аргументов в сигнатуре функции. Разберем подпись:

dst = resize( src, dsize[, dst[, fx[, fy[, interpolation]]]] )

  • src: это исходное изображение, размер которого вы хотите изменить. Это обязательный аргумент.
  • dsize: Это желаемый размер выходного изображения. Это также обязательный аргумент.
  • dst: Это необязательное выходное изображение. Если это предусмотрено, изображение с измененным размером будет сохранено здесь.
  • fx: это масштабный коэффициент по горизонтальной оси. Это необязательно.
  • fy: это масштабный коэффициент по вертикальной оси. Это необязательно.
  • interpolation: определяет используемый метод интерполяции. Это необязательно.

Итак, по сути, единственные два обязательных аргумента — это src и dsize, а остальные необязательны. Квадратные скобки вокруг dst, fx, fy и interpolation означают, что их можно опустить, и функция по-прежнему будет работать, используя значения по умолчанию или выводя их на основе предоставленных аргументов.

Кроме того, вложение скобок указывает на то, что dsize не является обязательным, если вы хотите указать dst и т. д.

tripleee 12.06.2024 06:45

Возможно также обратите внимание, что это не соглашение Python; на самом деле обычное соглашение в Python совершенно иное и несколько менее выразительное.

tripleee 12.06.2024 06:56

Это всего лишь соглашение в области информатики, когда необязательный характер чего-либо выражается помещением его в скобки. К сожалению, в данном контексте это приводит к еще большей путанице.

sureshvv 12.06.2024 07:08

Это всего лишь соглашение в области информатики, когда необязательный характер чего-либо выражается помещением его в скобки.

Например, см. справочную страницу grep.

grep [OPTION...] PATTERNS [FILE...]

К сожалению, в этом контексте (описывающем последовательность вызовов Python) это приводит к еще большей путанице. Было бы лучше использовать =None для указания параметров по умолчанию или использовать отдельные строки для описания различных допустимых последовательностей вызовов.

Ответ принят как подходящий

Это соответствует типичной нотации документации Python, описанной в документации .

Соответствующая часть цитируется ниже для справки (выделено мной)

В описаниях лексического анализа и синтаксиса используется модифицированная грамматическая запись формы Бэкуса – Наура (BNF).
...
... Звездочка (*) означает ноль или более повторений предыдущего пункта; аналогично, плюс (+) означает одно или несколько повторений, а фраза, заключенная в квадратные скобки ([ ]), означает ноль или одно вхождение (другими словами, заключенная фраза не является обязательной).

Обратите внимание: когда речь идет о синтаксисе, запятая не является чем-то особенным и ее следует рассматривать как литерал.

Давайте сначала рассмотрим пример со страницы документации itertools, чтобы понять, почему запятые заключаются в квадратные скобки именно таким образом. В таблице параметры itertools.islice() указаны как seq, [start,] stop [, step]. Из него можно получить четыре возможных прототипа функции в зависимости от количества вхождений каждой группы:

0 и 0 вхождений:

islice(seq, stop)

0 и 1 вхождений:

islice(seq, stop, step)

1 и 0 вхождений:

islice(seq, start, stop)

1 и 1 случаи:

islice(seq, start, stop, step)

Вы можете видеть, что запятая должна быть организована таким образом относительно квадратных скобок, чтобы правильно вывести все четыре синтаксиса. Если бы, например, грамматика была записана как seq, [start,] stop, [step] с запятой вне второй скобки, то для случая вхождений 0 и 0 мы получили бы islice(seq, stop,), что привело бы к избыточной запятой.

Синтаксис в вопросе можно интерпретировать точно так же. Ключевой момент здесь — на формальном уровне грамматики, запятая — это всего лишь буква, не следует рассматривать dst[ в целом, отсюда и возникает ваша путаница.

Например, если мы выберем одно вхождение для самой внешней скобки и ноль для остальных, мы получим один возможный синтаксис.

dst = resize( src, dsize[, dst[, fx[, fy[, interpolation]]]] )
                        1     0    0    0               0001 
-> dst = resize( src, dsize, dst )

Другой выбор приводит к другому допустимому синтаксису.

dst = resize( src, dsize[, dst[, fx[, fy[, interpolation]]]] )
                        1     1    0    0               0011 
-> dst = resize( src, dsize, dst, fx )

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

Как уже отмечали другие, форма Бэкуса-Наура очень распространена и не ограничивается Python. Подробности об изменениях, внесенных Python в исходную грамматику BNF, можно найти по ссылке выше.

Это весьма проницательно. Похоже, мне следует чаще просматривать документацию Python.

Anjishnu 12.06.2024 21:50

Другие вопросы по теме