2016-01-26 2 views
0

Я хотел бы знать, есть ли чистый способ проверить, содержит ли полка предмет. Как вы увидите в примере, мы не можем делать это со словарем (myObj in list(myDictionary.values())). Это письмо будет работать, если я ищу встроенный объект (str, int ...), но не будет работать, если я найду что-то еще.Проверьте, находится ли объект в полке

import shelve 

class foo(): 
    def __init__(self): 
     pass 

obj = foo() 

test = shelve.open('test') 

test["elmt1"] = 1 
test['elmt2'] = obj 

test.update() 

print(1 in list(test.values())) # Result is True 
print(obj in list(test.values())) # Result is False 

Если нет каких-либо простое решение, которое я, очевидно, работать только с копией полку и заменить сукно моей копией в конце моего сценария.

ответ

3

Определите __eq__ на своем классе foo и он будет работать. Очевидно, вам нужно будет выяснить, что означает равенство между двумя экземплярами того же класса, который не имеет атрибутов ...

E.g. В этом случае все экземпляры Foo сравниваются равными, поэтому ваш код выше будет печатать True для обоих случаев.

class Foo(object): 
    def __init__(self): 
     pass 
    def __eq__(self, other): 
     return isinstance(other, Foo) 

Кроме того, как хорошая практика, все ваши классы должны наследовать от object - см Python class inherits object и What is the difference between old style and new style classes in Python? для получения дополнительной информации.

+1

Это правильно. Вы можете видеть, что объекты не совпадают, печатая 'obj' и' list (test.values ​​()) [1] '- это будет тот же класс, но другой идентификатор, потому что это две разные копии. – viraptor

+0

@Tom Dalton Спасибо за ваш ответ! Я никогда не использовал '__eq__', поэтому я сразу же немного расследую его использование :) – Morgan

+0

Добро пожаловать! –

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