Наличие первого из неназванных аргументов необязательно - PullRequest
0 голосов
/ 28 мая 2018

Есть ли способ сделать первый аргумент функции необязательным?

myFunction <- function(a = NULL, b, c) {
  if(!is.null(a)) {
    d <- a + c
  } else {
    d <- b +c
  }
  return(d)
}

myFunction(1, 2)  # Fails, because c is missing

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

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

Мой пример R , но, насколько я знаю, тот же принцип верен в Python .

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

В R. именованные аргументы будут работать.

в python, чтобы избежать таких двусмысленностей, объявление такой функции даст очень понятную синтаксическую ошибку.

SyntaxError: non-default argument follows default argument

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

например,

def myFunction(a=None, *, b, c):
    pass

, но тогда вы можете тольковызвать функцию с позиционными аргументами от 0 до 1 и точно с двумя именованными аргументами

0 голосов
/ 28 мая 2018

В python вы можете использовать звездочку *, чтобы иметь аргумент по умолчанию в первой позиции. НО это только побочный эффект звездочки.Фактически, звездочка вызывает все аргументы ПОСЛЕ звездочки с именем аргументы.Таким образом, вы должны передать их функции в качестве именованных аргументов, например, с помощью b=1, c=2.Попробуйте:

def myFunction(*, a=None, b, c):
    if a is not None:
        d = a + c
    else:
        d = b +c
    return d

myFunction(b=1, c=2)

К сожалению, я могу говорить только за Python.Но, насколько я знаю, использование именованных аргументов также будет работать для R.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...