#python #discord #steam-web-api
Вопрос:
Я использую api steam с python и возвращаю недавно сыгранные игры пользователя. Он возвращает это (хотя и до тех пор, пока пользователь запустил столько игр за последние две недели, поэтому мне также нужно будет ограничить количество, указанное в строке). [<SteamApp «Блендер» (365670)>, <SteamApp «Блендер» (365670)><SteamApp «fpsVR» (908520)>, <SteamApp «fpsVR» (908520)><SteamApp «Инструментарий OVR» (1068820)>, <SteamApp «Инструментарий OVR» (1068820)><SteamApp «SteamVR» (250820)>]
Мой код выглядит следующим образом:
async def recently_played(self, ctx, userurl):
steam_user = steamapi.user.SteamUser(userurl=userurl)
await ctx.send(steam_user.recently_played)
Я попытался убрать речевые знаки, квадратные скобки, стрелки и запятые, но подумал… что, если в игре есть эти имена? Я также не мог понять, как вставлять между скобками, чтобы избавиться от кода SteamAppID.
Комментарии:
1. Вы уверены, что получаете обратно ниточку?
print(type(whatever_that_is))
— это подозрительно похоже на повторение по умолчанию из списка объектов Python. Начинающие программисты часто путают строку, которую они получают при печати чего-либо, с реальной вещью. Если на самом деле это список, тоprint(type(whatever_that_is[0]))
посмотрите, что это за объекты. Тогда вы должны иметь доступ к их атрибутам, напримерfor game in game_list: print(game.name)
, предполагая, что у них естьname
атрибут.
Ответ №1:
То, что у вас есть, — это не строка или список строк, это список SteamApp
объектов. Просто получите доступ SteamApp
к свойству каждого name
объекта, чтобы создать список имен или просто распечатать их. Нет необходимости выполнять все эти манипуляции со строками:
names = [app.name for app in user.recently_played] # a list of strings
Или:
for app in user.recently_played:
print(app.name)
Взгляните на исходный код SteamUser.recently_played
и SteamApp.name
.
Комментарии:
1. Хорошее решение. Это возможно при форматировании строк (при условии, что в качестве строки можно использовать steam_user.recently_played), но доступ к свойствам объекта лучше.
2. @paul M как я могу ограничить отображаемую сумму?
3. Вы можете разрезать исходный список, заменив
user.recently_played
его наuser.recently_played[0:3]
— в этом случае сохранив только первые три элемента в списке.
Ответ №2:
Если вы просто пытаетесь получить легко читаемый список игр, вы можете сделать что-то подобное, если данные, которые вы получаете, представляют собой строку:
# get this string from steam_user.recently_played
unformatted = '[<SteamApp "Blender" (365670)>, <SteamApp "fpsVR" (908520)>, <SteamApp "OVR Toolkit" (1068820)>, <SteamApp "SteamVR" (250820)>]'
gameList = unformatted.split('"')[1::2] # returns a list of the games. This is also possible with a regular expression
games = ", ".join(gameList)
print(games)
# returns Blender, fpsVR, OVR Toolkit, SteamVR
Комментарии:
1. чтобы красиво напечатать список, вы можете использовать
", ".join(gameList)
однострочный без конца,
2. @Trevis Спасибо, я отредактирую свой ответ, чтобы добавить это.
3. Но как бы я напечатал все это в одной строке? Хотя это похоже на решение
4. Проблема в том, @Spencer1O1, что фактический «неформатированный» — это список..