2015-11-22 2 views
0

Я пытаюсь написать сценарий приоритета таргетинга для ИИ. Моя цель - ранжировать цели на основе их оценки damage_per_shot/rate_of_fire и переупорядочить список в соответствии с самым высоким приоритетом таргетинга. Я, наконец, ошибся, но не знаю, как работать. 'NoneType' object has no attribute 'get'словарь переупорядочения python на основе комбинации значений

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

enemyList=[{"id":1,"damage_per_shot":10,"rate_of_fire":2},{"id":3,"damage_per_shot":0,"rate_of_fire":0},{"id":2,"damage_per_shot":14,"rate_of_fire":2}] 
#enemyList=unit_client.ask_nearest_enemy() 

print(enemyList) 
aDict = {} 
for item in enemyList: 
    if(item["rate_of_fire"]!=0): 
     currScore=float(item["damage_per_shot"]/item["rate_of_fire"]) 
    aDict[item['id']] = currScore 

def focus_fire2(data=None, *args, **kawargs): 
    print("===ff2===") 
    target_id=sorted(aDict, key=data.get) 
    print(target_id) 
    print("attacking: "+str(id)) 
    #unit_client.do_attack(key) 
    ##remove item from list 
    if(len(aDict)>0): 
     del aDict[target_id] #remove the object from the dict after done 
     print(aDict) 
     focus_fire2() 
    else: 
     return 0 
    #unit_client.when_item_destroyed(target, aDict.pop(key,None)) 
    #unit_client.when_item_destroyed(target, focus_fire2) 
focus_fire2() 

отслеживающий выглядит

[{'damage_per_shot': 10, 'id': 1, 'rate_of_fire': 2}, {'damage_per_shot': 0, 'id 
': 3, 'rate_of_fire': 0}, {'damage_per_shot': 14, 'id': 2, 'rate_of_fire': 2}] 
===ff2=== 
Traceback (most recent call last): 
    File "ffire.py", line 26, in <module> 
    focus_fire2() 
    File "ffire.py", line 13, in focus_fire2 
    target_id=sorted(aDict, key=data.get) 
AttributeError: 'NoneType' object has no attribute 'get' 
+0

Можете ли вы предоставить полную ошибку/отслеживающий – Totem

+1

Я заметил, что у вас есть «data.get» в функции focus_fire2, и в аргументах вы устанавливаете данные в None по умолчанию. Если вы специально не задали данные для чего-то вроде focus_fire2 (data = something), тогда ошибка имеет смысл ... – Totem

+0

@Paul Rooney, спасибо за включение traceback – Rilcon42

ответ

0

Просто замените

sorted(aDict, key=data.get) 

по

sorted(aDict, key=aDict.get) 
0

В вашей функции focus_fire2, вы установите data в None по умолчанию в аргументах определения функции. Если вы не установили его на что-то отличное от None, когда вы его назовете, например focus_fire2(data=something), тогда он будет равен None, когда вы это сделаете, data.get() позже. Думаю, и твоя ошибка. Вы лечите NoneType как dict. Если вы звоните get, вы, вероятно, должны установить его равным dict или другим.

+0

, так что 'aDict' не известно внутри функции? Я решил бы это, сделав глобальную переменную? путем передачи его функции как-то? – Rilcon42

+0

на основе вашего редактирования. Если я задаю 'data = dict', я скажу функции, чтобы ожидать все словари, или я устанавливаю ее в' aDict' конкретно? – Rilcon42

+0

aDict следует хорошо знать, это данные, о которых я думаю. Он установлен в None, и вы вызываете на нем метод слова (get) – Totem

0

Вы получаете сообщение об ошибке, поскольку функция запуска без аргументов и данные по умолчанию имеют тип None. И для меня это не очень хорошая идея, установите значение по умолчанию как None для необязательных аргументов. Вам нужно запустить функцию с аргументом focus_fire2(aDict) или изменить target_id=sorted(aDict, key=data.get) на target_id=sorted(aDict, key=aDict.get, reverse=True), вы получаете в target_id, список отсортированного ключа от aDict, где первое значение выше. Но target_id - это список, и этот код является неправильным del aDict[target_id]. Что должно быть в target_id?

Смежные вопросы