#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. Это не ошибка, это просто ввод текста.
4. Ничто не мешает авторам Thread делать то же самое в будущем. Да, есть: это было бы нарушением обратной совместимости, к которому разработчики ядра относятся очень серьезно. Они будут очень осторожны, чтобы избежать этого, и, если сочтут абсолютно необходимыми, они пройдут период устаревания, к которому приведет использование списка аргументов
DeprecationWarning
. Вы правы насчет numpy, но это совершенно другой проект, чем CPython, и numpy не является Pythonic во множестве способов — так что их позиция по набору утиного текста здесь не очень уместна.5. @wim. Я думаю, что здесь нам придется просто не согласиться. Если пользователь спросил: «У меня есть некоторый код, который передает список в arg = . Должен ли я это исправить? » Я бы согласился с вами. Но на самом деле вопрос таков: «Мне не нравится синтаксис одноэлементных кортежей Python; должен ли я в любом случае писать код в соответствии с документацией? Должен ли я учить других людей, что им не нужно следовать явной документации? » Для меня ответы явно да и нет. YMMV.