Может быть, вам нужны ключевые аргументы в Javascript или Python?

Можете ли вы иметь обязательные ключевые аргументы в JavaScript или Python? Это общая черта языков программирования, или она новая и редкая? Они будут аналогичны этой реализации аргументов ключевых слов в Ruby в Ruby 2.1+

def obvious_total(subtotal:, tax:, discount:)
  subtotal + tax - discount
end

obvious_total(subtotal: 100, tax: 10, discount: 5) # => 105

(Приведенный выше пример взят прямо с https://robots.thoughtbot.com/ruby-2-keyword-arguments)

Я хотел бы знать, потому что я был действительно заинтересован в перспективе автора вышеупомянутой страницы. Он в основном предполагает, что требуемые аргументы ключевых слов помогут программистам понять код друг друга в дальнейшем, в то же время жертвуя лишь краткостью. Лично я считаю, что это достойный компромисс, и мне интересно, практикуется ли он на практике или нет.

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

1 ответ

Решение

В PEP-3102 введены "аргументы только для ключевых слов", поэтому в Python 3.x вы можете сделать следующее:

def obvious_total(*, subtotal, tax, discount):
    """Calculate the total and force keyword arguments."""
    return subtotal + tax - discount

В использовании:

>>> obvious_total(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: obvious_total() takes 0 positional arguments but 3 were given
>>> obvious_total(subtotal=1, tax=2, discount=3)
0

В JavaScript (до ES6) вообще не было аргументов с ключевыми словами. Соглашение для этого должно было бы определить единственный позиционный аргумент, в который пользователь передает литерал объекта:

obviousTotal = function (input) {
    return input.subtotal + input.tax - input.discount
}

а затем передать объектный литерал как input, В использовании:

> obviousTotal(1, 2, 3)
NaN  // because (1).subtotal etc. are undefined 
> obviousTotal({ subtotal: 1, tax: 2, discount: 3 })
0

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

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