Решение на BiDict от Никола Собаджиев

Обратно към всички решения

Към профила на Никола Собаджиев

Резултати

  • 3 точки от тестове
  • 0 бонус точки
  • 3 точки общо
  • 9 успешни тест(а)
  • 7 неуспешни тест(а)

Код

class BiDict(dict):
'''Bidirectional dictionary - you can invert the key-value pairs'''
def __init__(self, *args, **kwargs):
# update is needed to forse all pair to go through setitem and get
# checked for immutability
self.update(*args, **kwargs)
def update(self, *args, **kwargs):
'''Forces all pairs in the arguments to go through setitem'''
for k, v in dict(*args, **kwargs).items():
self[k] = v
def inverse(self):
'''Inverts all key-value into value-key pairs'''
for k, v in self.items():
del self[k]
self[v] = k
def __setitem__(self, key, val):# raise TypeError
'''Sets new items in the dictionary and checks for immutability'''
# The following code relies on the fact that if an object is
# immutable, the hash function will be successful, and if not
# it will raise an TypeError exception
try:
hash(val)
hash(key)
except TypeError:
raise TypeError
dict.__setitem__(self, key, val)

Лог от изпълнението

.EEEE...F.F...E.
======================================================================
ERROR: test_assign_value_and_reverse (__main__.BiDictTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/test20120627-22085-9hd46a", line 18, in test_assign_value_and_reverse
    self.assertEqual(self.person['Кънчов'], 'last_name')
KeyError: 'Кънчов'

======================================================================
ERROR: test_circular_values (__main__.BiDictTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/test20120627-22085-9hd46a", line 49, in test_circular_values
    circular = self.solutions.BiDict({1: 2, 2: 3, 3: 1})
AttributeError: 'BiDictTestCase' object has no attribute 'solutions'

======================================================================
ERROR: test_copied_circular_values (__main__.BiDictTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/test20120627-22085-9hd46a", line 57, in test_copied_circular_values
    inversed_circular.inverse()
AttributeError: 'dict' object has no attribute 'inverse'

======================================================================
ERROR: test_double_inverse (__main__.BiDictTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/test20120627-22085-9hd46a", line 23, in test_double_inverse
    self.assertEqual(self.person['name'], 'Кънчо')
KeyError: 'name'

======================================================================
ERROR: test_lots_of_even_inverses (__main__.BiDictTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/test20120627-22085-9hd46a", line 32, in test_lots_of_even_inverses
    self.assertEqual(self.person['name'], 'Кънчо')
KeyError: 'name'

======================================================================
FAIL: test_insert_existing_key_with_existing_value (__main__.BiDictTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/test20120627-22085-9hd46a", line 78, in test_insert_existing_key_with_existing_value
    self.assertNotIn('age', new_person.keys())
AssertionError: 'age' unexpectedly found in dict_keys(['age', 'name', 'sex'])

======================================================================
FAIL: test_insert_none_existing_key_with_existing_value (__main__.BiDictTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/test20120627-22085-9hd46a", line 92, in test_insert_none_existing_key_with_existing_value
    self.assertNotIn('age', new_person.keys())
AssertionError: 'age' unexpectedly found in dict_keys(['age', 'name', 'none', 'sex'])

----------------------------------------------------------------------
Ran 16 tests in 0.004s

FAILED (failures=2, errors=5)

История (1 версия и 2 коментара)

Никола обнови решението на 14.04.2012 13:00 (преди над 12 години)

+class BiDict(dict):
+ '''Bidirectional dictionary - you can invert the key-value pairs'''
+ def __init__(self, *args, **kwargs):
+ # update is needed to forse all pair to go through setitem and get
+ # checked for immutability
+ self.update(*args, **kwargs)
+
+ def update(self, *args, **kwargs):
+ '''Forces all pairs in the arguments to go through setitem'''
+ for k, v in dict(*args, **kwargs).items():
+ self[k] = v
+
+ def inverse(self):
+ '''Inverts all key-value into value-key pairs'''
+ for k, v in self.items():
+ del self[k]
+ self[v] = k
+
+ def __setitem__(self, key, val):# raise TypeError
+ '''Sets new items in the dictionary and checks for immutability'''
+ # The following code relies on the fact that if an object is
+ # immutable, the hash function will be successful, and if not
+ # it will raise an TypeError exception
+ try:
+ hash(val)
+ hash(key)
+ except TypeError:
+ raise TypeError
+ dict.__setitem__(self, key, val)

Коментарите из python-ски код е съвършено грешен подход. Въпросните забележки, които си сложил е ок да са в docstring-а.

А това:

def __setitem__(self, key, val):# raise TypeError

е ужасен стил. Предполагам ти е дошло на ум от Java, където трябва да укажеш какво може да хвърли метода, но в python не е така. Няма нужда и не трябва да се указва това.

Освен това - не съм сигурен, че има нужда да се опитваш да проверяваш за хеш на ключа - така или иначе самяи dict го прави, но това е бял кахър.

Методът inverse е изключително четим, но какво ще стане ако ти подам речник: {1: 2, 2: 3, 3: 1} и изпълна inverse()? :)

Можеш ли да обясниш с две изречения защо коментрите са грешен подход. Не мога да си го обясня. Не винаги всичко може да се сложи в док стринг-а, особено в по - дълга функция (дългите функции също не са особено добра идея, но реалността е, че често се срещат). Аз останах в впечатлението, че док стринг-а е място, на което да обясниш каква е тази функция и какво прави, а не да се влиза в детайли за имплементацията и защо нещо е направено по определен начин. Thx!