H.Falcon 0 Posted August 1, 2016 Что-то я делаю не так и не могу понять . Прошу помощи, пожалуйста. Хочу получить список участников боя. И всё хорошо, только не получается дополнить его именами машин, на которых игроки вышли в бой и именем места боя. Кучу вариантов перепробовал. Проверяю методом dir(объект) какие есть атрибуты, а получить те, что есть, не выходит. TypeError: 'Vehicle' object has no attribute '__getitem__' (это попытка получить свою машину: try: avatarVehicle = BigWorld.player().getVehicleAttached() print 'ID = %s' % str(avatarVehicle['id']) except Exception: LOG_CURRENT_EXCEPTION() ) При сканировании BigWorld.player().arena.vehicle.values() доступен атрибут vehicleType. Но любые попытки получить из него что-либо кончаются в лучшем случае строкой: 'vehicleType': '<items.vehicle.vehicleDescr of Object at ...>' (или типа этой строки, лог уже дропнул) или ошибкой TypeError: 'VehicleDescr' object is not iterable Quote Share this post Link to post Short link Share on other sites
VasyaPRO_2014 163 #341026 Posted August 1, 2016 BigWorld.player().arena.vehiclesЭто словарьСоответсвенно BigWorld.player().arena.vehicles.values() список из значений этого словаря. По нему можно обращаться по индексу: BigWorld.player().arena.vehicles.values()[0] Либо пройтись циклом: for player in BigWorld.player().arena.vehicles.values(): # Здесь player - тоже словарь, и у него есть разные ключи среди которых name и vehicleType print player['name'], # Player name print player['vehicleType'].type.userString # Vehicle name Quote Share this post Link to post Short link Share on other sites
H.Falcon 0 #341079 Posted August 1, 2016 ... print player['vehicleType'].type.userString # Vehicle name Спасибо! Не понял только на каком основании вот эта строка... Метод dir ни атрибута, ни метода type не показывал в наличии у player['vehicleType'] Quote Share this post Link to post Short link Share on other sites
VasyaPRO_2014 163 #341157 Posted August 1, 2016 Не понял только на каком основании вот эта строка... player - это словарь (он же dict, он же ассоциативный массив), доступ к элементам которого осуществляется по ключу примерно так названиеСловаря["Ключ"]. Список всех ключей можно получить к примеру так: print player.keys() либо просто print player # Выведет и ключи и их значения. Quote Share this post Link to post Short link Share on other sites
H.Falcon 0 #341340 Posted August 2, 2016 Спасибо за разъяснение. Но не всё так просто, как кажется. Вы писали : print player # Выведет и ключи и их значения. try: for p in BigWorld.player(): print p except Exception: LOG_CURRENT_EXCEPTION() Этот код выдаёт ошибку: *** EXCEPTION(mod_1, 88):*** Traceback (most recent call last):*** File "mod_1", line 85, in test*** TypeError: 'PlayerAvatar' object is not iterable Прошу прощения, не получилось правильно отформатировать предыдущее сообщение. Оказалось, что нельзя для форматирования использовать табуляцию. Quote Share this post Link to post Short link Share on other sites
POLIROID 210 #341381 Posted August 2, 2016 Та изи же, сверху даже бросали готовое player = BigWorld.player() for vehicleID, vehicle in player.arena.vehicles.iteritems(): pName, pTeam, vName, vLocalName = vehicle['name'], vehicle['team'], vehicle['vehicleType'].name, vehicle['vehicleType'].type.userString # никнейм, имя танка кирилицей, команда игрока, имя танка латиницей (внутреигровое) print pName, vLocalName, pTeam, vName Quote Share this post Link to post Short link Share on other sites
VasyaPRO_2014 163 #341431 Posted August 2, 2016 for p in BigWorld.player(): print p А это не работает т.к. нужно for p in BigWorld.player().arena.vehicles.values(): print p Quote Share this post Link to post Short link Share on other sites
H.Falcon 0 #341434 Posted August 2, 2016 Да не надо обижаться-то. Кажись я не смог правильно сформулировать последнее своё сообщение. Попробую пояснить на базе Вашего последнего кода. vehicle['name'], vehicle['team'] - да конечно vehicle['vehicleType'].name - ну может быть, если там не значение, а структура vehicle['vehicleType'].type.userString - но почему это? .type.userString в атрибутах даже близко ничего не высвечивается Вот в чём был последний мой вопрос. Я в Питоне не так давно. В известных мне языках такого подхода нет (если только vehicle['vehicleType'] не является объектом), да и Питоновский хелп такого решения не даёт. Можно попробовать явное приведение типов, но надо знать к какому типу приводить. Кстати и тут Марк Лутц. Изучаем Python, 4-е издание ничего похожего я не нашёл. Quote Share this post Link to post Short link Share on other sites
VasyaPRO_2014 163 #341454 Posted August 2, 2016 vehicle['vehicleType'].type.userString - но почему это? .type.userString в атрибутах даже близко ничего не высвечивается Ну вот же: screenshot userString - это уже атрибут type и он тоже нормально высвечивается. Quote Share this post Link to post Short link Share on other sites
H.Falcon 0 #341499 Posted August 2, 2016 Получается эти две записи эквивалентны? vehicle['vehicleType'].type.userString vehicle.vehicleType.type.userString Ведь, если мы type можем так указать, то и vehicleType то же. А такой вопрос: судя по приложенному скрину есть возможность в Орионе выполнять отдельные строки без привязки их к скриптам? Quote Share this post Link to post Short link Share on other sites
VasyaPRO_2014 163 #341532 Posted August 2, 2016 vehicle.vehicleType.type.userString Так не будет работать. судя по приложенному скрину есть возможность в Орионе выполнять отдельные строки без привязки их к скриптам? Да, пишете код, нажимаете WOT-Transmission>Exec script in client (for ANSI) либо сочетание клавиш Shift+F5. Ещё есть такая удобная штука как Run>Express script. Я в основном её использую для таких вещей т.к. в главном окне находится скрипт мода. Quote Share this post Link to post Short link Share on other sites
H.Falcon 0 #341552 Posted August 2, 2016 Так не будет работать. ...Я в основном её использую для таких вещей т.к. в главном окне находится скрипт мода. Так вот и не понятно, почему для type можно так писать, а для 'vehicleType' нельзя. Хотелось бы почитать, где это прописано. А вот у меня экспресс скрипт выполняется только типа print 'blablabla' На всё другое кричит, что модуль не определён. Может что не так делаю: 1.в окне открыт скрипт, который в разработке 2.после компиляции и копирования в каталог /scripts/client/gui/mods запускаю игру F11 3.после логина, находясь в игре, вызываю окно экспресс скрипта 4.ввожу текст (например: print dir(BigWorld.player().arena)) и жму F5 5.получаю ошибку, модуль не определён если указать import BigWorld - ничего не изменится Вот и приходится изменить несколько строк, скомпилить, кинуть в папку, запустить игру, сыграть бой, выйти из игры, проанализировать лог. Quote Share this post Link to post Short link Share on other sites
VasyaPRO_2014 163 #341579 Posted August 2, 2016 Так вот и не понятно, почему для type можно так писать, а для 'vehicleType' нельзя. Хотелось бы почитать, где это прописано. Потому что vehicle['vehicleType'] - это получить значения элемента словаря vehicle с ключем 'vehicleType', а vehicle['vehicleType'].type - это обратится к атрибуту type объекта что хранится в vehicle['vehicleType'] (В данном случае это экземпляр класса VehicleDescr, который можно найти в scripts/common/items/vehicles.pyc). Так вот у этого класса есть атрибут type, что можно без проблем проверить в декомпилированном скрипте. Может что не так делаю: ... ввожу текст (например: print dir(BigWorld.player().arena)) и жму F5 Нужно Shift+F5. Я в основном всё делаю в реплеях: открываю реплей в WOT-Transmission. Ставлю его на паузу, открываю экспресс скрипт и пишу что хочу, потом жму Shift+F5 и всё работает. Кстати чтобы каждый раз не писать print dir(что-то-там) можно в Орионе нажать ПКМ потом Select the attributes source и выбрать WOT. Теперь когда пишете к примеру BigWorld.player().arena ставите точку и получаете список всех только "публичных" (для всех нужно успеть нажать ctrl+shift+space) атрибутов. 1 Quote Share this post Link to post Short link Share on other sites
H.Falcon 0 #341594 Posted August 2, 2016 Как говорится "..Семён Семёныч!..." Огромное СПАСИБО! Честно говоря и не надеялся на столь подробное разъяснение. Хороший "пинок" в нужном направлении! СПАСИБО! Quote Share this post Link to post Short link Share on other sites
sl101 3 #341926 Posted August 3, 2016 (edited) А можно вот так: from gui.battle_control.arena_info import vos_collections from gui.battle_control import g_sessionProvider as g_BattleSessionProvider isEnemy = True #или False ArenaDP = g_BattleSessionProvider.getArenaDP() SortKey = vos_collections.VehicleInfoSortKey if isEnemy: collection = vos_collections.EnemyItemsCollection(sortKey=SortKey) else: collection = vos_collections.AllyItemsCollection(sortKey=SortKey) for Index, (vInfoVO, vStatsVO) in enumerate(collection.iterator(ArenaDP)): print Index, vInfoVO.vehicleID Получим список танков в том порядке, в котором они идут в ушах. И дальше, зная vehicleID, более подробная информация: BigWorld.player().arena.vehicles[VehicleID] И для засвеченных - еще более подробная: BigWorld.entity(VehicleID) Edited August 3, 2016 by sl101 1 Quote Share this post Link to post Short link Share on other sites