Лучший способ определить «аргументы» в конструкторе потоков?

#python #multithreading

#python #многопоточность

Вопрос:

Когда вы создаете поток, вы передаете аргументы как итерируемые, обычно кортеж, подобный этому:

 import threading
import time

def countdown(secs):
    for second in range(secs, 0, -1):
        print(f"{second}!", end = " ")
        time.sleep(1)
    print("Happy New Year!")

countdown_thread = threading.Thread(target=countdown, args=(5,))
countdown_thread.start()
countdown_thread.join()
 

Я думаю (5,) , что это синтаксически грубо и затрудняет объяснение происходящего. Эта строка работает так же хорошо:

 countdown_thread = threading.Thread(target=countdown, args=[5])

 

Есть ли какая-либо веская причина не передавать просто список, а не кортеж Thread ? Я не хочу вводить людей в заблуждение.

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

Комментарии:

1. tuple является неизменяемым, но я сомневаюсь Thread , что он все равно попытается мутировать args . Технически в документах указано: » args является кортежем аргументов для целевого вызова. По умолчанию () используется значение» . но я предполагаю, что они действительно просто требуют последовательности, поэтому для всех практических целей я не вижу причин, по которым вы не можете пройти list , если хотите.

Ответ №1:

В документации говорится:

«аргументы — это кортеж аргументов для целевого вызова. По умолчанию используется значение ().» Ссылка

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

Комментарии:

1. «Тот факт, что он принимает список, является ошибкой» , что является сильным утверждением, которое, я бы сказал, неверно. Я бы сказал, что более правильным утверждением, вероятно, является то, что документы используют слово «кортеж», когда вместо этого они должны использовать «последовательность» или что-то в этом роде.

2. Это не ошибка, это просто ввод текста.

3. @wim. Проблема в том, что мы понятия не имеем, является ли это утиным вводом или нет. Например, в Numpy есть разные места, где кортеж в качестве индекса дает результат, отличный от идентичного списка в качестве индекса. Ничто не мешает авторам Thread делать то же самое в будущем. В документации могло быть сказано «итерируемый»; он мог бы сказать «список или кортеж»; он мог бы сказать «последовательность». Это не так. Если вы сомневаетесь, следуйте документации.

4. Ничто не мешает авторам Thread делать то же самое в будущем. Да, есть: это было бы нарушением обратной совместимости, к которому разработчики ядра относятся очень серьезно. Они будут очень осторожны, чтобы избежать этого, и, если сочтут абсолютно необходимыми, они пройдут период устаревания, к которому приведет использование списка аргументов DeprecationWarning . Вы правы насчет numpy, но это совершенно другой проект, чем CPython, и numpy не является Pythonic во множестве способов — так что их позиция по набору утиного текста здесь не очень уместна.

5. @wim. Я думаю, что здесь нам придется просто не согласиться. Если пользователь спросил: «У меня есть некоторый код, который передает список в arg = . Должен ли я это исправить? » Я бы согласился с вами. Но на самом деле вопрос таков: «Мне не нравится синтаксис одноэлементных кортежей Python; должен ли я в любом случае писать код в соответствии с документацией? Должен ли я учить других людей, что им не нужно следовать явной документации? » Для меня ответы явно да и нет. YMMV.