Может быть, вам нужны ключевые аргументы в 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 позволяет немного упростить это с помощью деструктуризации, но до сих пор (насколько я знаю) нет встроенной поддержки требуемых аргументов ключевых слов.