Можете ли вы ссылаться на позиционные аргументы при установке значений по умолчанию для аргументов ключевых слов? - PullRequest
1 голос
/ 03 февраля 2020

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

def iterate(list_a, list_b = np.zeros((len(list_a),), dtype=int)):
    for a, b in zip(list_a, list_b):
        # do something with a and b

Однако я получаю сообщение об ошибке, что list_a не определен, что свидетельствует о том, что я не могу выполнить самоссылку вычисления в скобках при определении функции. Очевидное решение состоит в том, чтобы выбрать специальное значение по умолчанию для list_b и, если оно оставлено неизменным при вызове функции, изменить его на список нулей с помощью оператора if:

def iterate(list_a, list_b = 'zeros'):

    if list_b == 'zeros':
        list_b = np.zeros((len(list_a),), dtype=int)

    for a, b in zip(list_a, list_b):
        # do something with a and b

Это решение не кажется очень pythoni c для меня, и мне интересно, есть ли лучшая практика для этого.

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

1 Ответ

1 голос
/ 03 февраля 2020

Нет, этого нельзя сделать, но вы в основном решили проблему обычным способом. Обычно в этом случае люди устанавливают значения по умолчанию None и делают то же самое (просто потому, что это менее странно при наборе текста и, следовательно, при помощи linting - функция принимает либо массив, либо ничего, а не массив или строку.)

С точки зрения удобства использования вы можете сообщить пользователю, что значение по умолчанию эффективно делает в сценарии do c.

def iterate(list_a, list_b=None):
    'list_b defaults to zero array of size a'
    if not list_b:
        list_b = np.zeros((len(list_a),), dtype=int)

    for a, b in zip(list_a, list_b):
        # do something with a and b

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

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