Не работает join python

Функция .join () не работает в Python

Мне было интересно, может ли кто-нибудь помочь мне понять, почему мои несколько строк кода не работают в Python. Я пытаюсь создать свою собственную версию игры «Морской бой», но не могу заставить работать функцию .join ().

Тем не менее, мой результат в конечном итоге:

Когда я чувствую, что это должно быть:

Любая помощь приветствуется! Спасибо!

4 ответа

Ваша проблема здесь:

Выполнение «O» * 5 не создает список строк. Он просто создает одну строку:

Таким образом, то, что вы в основном делаете при использовании str.join :

Это, конечно, не удается, поскольку список, переданный в str.join , содержит отдельный элемент , а str.join работает путем объединения списка с несколькими элементами. Из документации для str.join :

str.join ( итерация )

Вернуть строку, которая является объединением строк в итерируемом. Ошибка TypeError будет возникать, если в итерируемых есть какие-либо нестроковые значения, включая байтовые объекты. Разделителем между элементами является строка, обеспечивающая этот метод.

Вместо этого вам нужно создать каждую строку в board из пяти ‘O’ с:

Вместо создания вторичных списков ‘O’ , вы можете оставить их как строки длиной пять ‘OOOOO’ и полагать, что ‘ ‘.join(‘OOOOO’) будет работать, потому что ‘OOOOO’ также является итеративным.

Кроме того, я бы предпочел написать функцию print_board следующим образом:

Вы можете разделить ваш ряд как:

[«0» * 5] приводит к [«00000»] . Вероятно, вам нужен [«0»] * 5 , который составляет список из пяти элементов.

Источник

Почему в этом случае не работает os.path.join ()?

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

Когда я проверяю это, он сохраняет только часть кода /new_sandbox/ .

13 ответов

Последние строки не должны начинаться с косой черты. Если они начинаются с косой черты, то они считаются «абсолютным путем», и все, что перед ними, отбрасывается.

Если компонент является абсолютным путем, все предыдущие компоненты отбрасываются, и соединение продолжается с компонента абсолютного пути.

Обратите внимание на Windows, поведение по отношению к буквам дисков, которое, кажется, изменилось по сравнению с более ранними версиями Python:

В Windows буква диска не сбрасывается при обнаружении компонента абсолютного пути (например, r’\foo’ ). Если компонент содержит букву диска, все предыдущие компоненты отбрасываются и буква диска сбрасывается. Обратите внимание, что поскольку для каждого диска существует текущий каталог, os.path.join(«c:», «foo») представляет путь относительно текущего каталога на диске C: ( c:foo ), а не c:\foo .

os.path.join() может использоваться вместе с os.path.sep для создания абсолютного, а не относительного пути.

Читайте также:  Не работает функция прикрепить файл

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

Если приложение выполняется с:

Будет использован файл конфигурации /etc/myapp.conf/foo.conf .

Но подумайте, что произойдет, если приложение вызывается с помощью:

Тогда myapp должен использовать файл конфигурации в /some/path/bar.conf (а не /etc/myapp.conf/some/path/bar.conf или подобном).

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

Идея os.path.join() состоит в том, чтобы сделать вашу программу кроссплатформенной (linux / windows / etc).

Даже один слэш разрушает его.

Так что это имеет смысл только при использовании с какой-то точкой отсчета, как os.environ[‘HOME’] или os.path.dirname(__file__) .

Это потому, что ваш ‘/new_sandbox/’ начинается с / и, таким образом, считается относительным к корневому каталогу. Удалить ведущий / .

Чтобы сделать вашу функцию более переносимой, используйте ее следующим образом:

Обратите внимание, что подобная проблема может вас укусить, если вы используете os.path.join() для включения расширения, которое уже содержит точку, что происходит автоматически при использовании os.path.splitext() . В этом примере:

Хотя extension может быть .jpg , в итоге вы получите папку с именем «foobar», а не файл с именем «foobar.jpg». Чтобы предотвратить это, вам нужно добавить расширение отдельно:

Попробуйте комбинировать split(«/») и * для строк с существующими объединениями.

Как это работает .

split(«/») превращает существующий путь в список: [», ‘home’, ‘build’, ‘test’, ‘sandboxes’, »]

* перед списком выделяет каждый элемент списка своим собственным параметром

Не используйте прямую косую черту в начале компонентов пути, за исключением случаев обращения к корневому каталогу:

Источник

Discord.py бот — не работает метод on_member_join

Ни @bot.event, ни @client.event не работают. SERVER MEMBERS INTENT включено. В чём может быть проблема?

3 ответа 3

bot = commands.Bot(command_prefix = ‘$’, intents=intents)

Включи их на сайте discord developer во вкладке bot. Вот ссылка на документацию: https://discordpy.readthedocs.io/en/latest/intents.html

Читайте также:  Любить работу значит не работать

я тоже долго страдал от этой проблемы, связана она с обновлением discord API, чтобы event заработал, достаточно в начале прописать это: (Я с телефона, так что код почему-то добавить нельзя) intents = discord.Intents.all()

Должно получиться так: client = commands.Bot(command_prefix = «!», intents = discord.Intents.all())

У меня всё сразу заработало

Всё ещё ищете ответ? Посмотрите другие вопросы с метками python bot discord или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.18.40487

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

Вызов ».join ведёт к ошибке: TypeError: can only join an iterable

приводит к ошибке:

1 ответ 1

str.join(iterable) ожидает в качестве аргумента iterable — объект поддерживающий итерирование.

iterable An object capable of returning its members one at a time. Examples of iterables include all sequence types (such as list , str , and tuple ) and some non-sequence types like dict , file objects, and objects of any classes you define with an __iter__() or __getitem__() method. Iterables can be used in a for loop and in many other places where a sequence is needed ( zip() , map() , . ). When an iterable object is passed as an argument to the built-in function iter() , it returns an iterator for the object. This iterator is good for one pass over the set of values. When using iterables, it is usually not necessary to call iter() or deal with iterator objects yourself. The for statement does that automatically for you, creating a temporary unnamed variable to hold the iterator for the duration of the loop. See also iterator, sequence, and generator.

по простому на русском (c) @jfs:

».join() принимает составной объект—коллекцию строк, такую как список, которую можно в for-цикл передать, чтобы все строки обойти

Вот один из способов определения является ли объект итерируемым и заодно примеры итерируемых объектов:

Источник

зависание приложения python на thread.join ()

Я пишу простое приложение для отслеживания времени на Python3 и PyQt5. Время отслеживается в отдельной ветке. Функция, которую выполняет этот поток, не имеет доступа к коду GUI. На Windows10 приложение зависает после попытки его закрыть. Это вызвано вызовом thread.join() . Мне нужно завершить процесс в диспетчере задач, чтобы закрыть его. На Linux Mint работает нормально. Я использую темы из библиотеки потоков. Это не работает также с QThread. Если я закомментирую строку thread.join() , она закроется без проблем, но код, выполняемый этим потоком, не завершится.

Читайте также:  Не могу настроить механические часы

Поток инициализируется в функции __init__() класса Window.

Функция, которая отвечает за отслеживание времени:

Присоединяясь к теме:

EDIT2: после удаления этих двух строк приложение закрывается без проблем. Есть ли другой способ получить имя активного окна в Windows, кроме win32gui ?:

2 ответа

Проблема возникает из-за того, что GetWindowText() блокируется, и поэтому ваш поток никогда не может присоединиться. Чтобы понять, почему, мы должны углубиться в документация по win32

Если целевое окно принадлежит текущему процессу, GetWindowText вызывает отправку сообщения WM_GETTEXT в указанное окно или элемент управления . Если целевое окно принадлежит другому процессу и имеет заголовок, GetWindowText извлекает текст заголовка окна. Если окно не имеет заголовка, возвращаемое значение — пустая строка. Такое поведение является особенностью. Он позволяет приложениям вызывать GetWindowText, не переставая отвечать, если процесс, которому принадлежит целевое окно, не отвечает. Однако, если целевое окно не отвечает и принадлежит вызывающему приложению, GetWindowText приведет к тому, что вызывающее приложение перестанет отвечать .

Вы пытаетесь присоединиться к потоку из функции ( saveAndQuit ), которая была вызвана циклом событий Qt. Таким образом, до тех пор, пока эта функция не вернется, цикл событий Qt не будет обрабатывать никаких сообщений. Это означает, что вызов GetWindowText в другом потоке отправил сообщение в цикл событий Qt, которое не будет обработано до завершения saveAndQuit . Однако saveAndQuit ожидает завершения потока, и у вас тупик!

Есть несколько способов разрешения тупиковой ситуации, вероятно, самый простой из них — это рекурсивный вызов join с тайм-аутом из цикла событий Qt. Это несколько «взломано», но другие альтернативы означают такие вещи, как изменение поведения вашего потока или использование QThreads.

Поэтому я бы изменил ваш saveAndQuit следующим образом:

У меня была похожая проблема, и кто-то здесь на SO посоветовал мне использовать что-то вроде этого:

У меня отлично работает, my_thread работает до тех пор, пока работает qt_app, и завершает свою работу при выходе.

Источник

Оцените статью