Search code examples
pythondel

Can't select object in list and delete it


I've spent an hour or two collectively now trying to figure this problem out but I'm not getting any results. In my program when a defending animal is "killed" it should be deleted from it's registry, but no matter what I do I can't seem to get that to happen. In this instance if I were to initiate a hunter and a buffalo then attack() the buffalo with the hunter the buffalo should be killed and removed from it's classes registry but I can't get python to select that specific buffalo from the registry.

Any help is appreciated.

class IterRegistry(type):
    def __iter__(cls):
        return iter(cls._registry)

class Buffalo(object):
    __metaclass__ = IterRegistry
    _registry = []
    hp = 1
    price = 150
    attacks = 0
    regeneration = 2

    def __init__(self, name):
        self._registry.append(self)
        self.name = name

def createBuffalo():
    for i in range(len(Buffalo._registry),len(Buffalo._registry)+1):
        varname = ("b" + str(i))
        globals()[varname] = Buffalo("b" + str(i))

class Wolf:
    __metaclass__ = IterRegistry
    _registry = []
    hp = 1
    price = 0
    attacks = 2
    regeneration = 1.5

    def __init__(self, name):
        self._registry.append(self)
        self.name = name

def createWolf():
    for i in range(len(Wolf._registry),len(Wolf._registry)+1):
        varname = ("w" + str(i))
        globals()[varname] = Wolf("w" + str(i))

class Hunter:
    __metaclass__ = IterRegistry
    _registry = []
    hp = 2
    price = 0
    attacks = 1
    regeneration = 0
    balance = 0

    def __init__(self, name):
        self._registry.append(self)
        self.name = name

def createHunter():
    for i in range(len(Hunter._registry),len(Hunter._registry)+1):
        varname = ("h" + str(i))
        globals()[varname] = Hunter("h" + str(i))

def attack(attacker, target):
    if attacker.attacks >= 1:
        target.hp -= 1
        if target.hp == 0:
            if type(attacker) == Hunter:
                attacker.balance += 150
            print(target)
            if type(target) == Wolf:
                del Wolf._registry[[n for n in Wolf._registry if n == target]]
            if type(target) == Hunter:
                del Hunter._registry[[n for n in Hunter._registry if n == target]]
            if type(target) == Buffalo:
                del Buffalo._registry[[n for n in Hunter._registry if n == target]]

One more note, the reason I have double brackets is because it was incorrect syntax with single brackets but the syntax was fine with doubles.

If you need any more code, ask in a comment below (I have not included all of it but it should be enough).


Solution

  • The issue you're trying to solve is caused by trying to use a list as an index to be removed from your list

    [n for n in Wolf._registry if n == target]
    

    All you're trying to get out of this list comprehension is the target, so just use that.

    Wolf._registry.remove(target)