mirror of
https://github.com/satwikkansal/wtfpython
synced 2024-11-24 20:14:23 +01:00
Translate The mysterious key type conversion example
This commit is contained in:
parent
58de881f93
commit
f96f5117c5
57
translations/README-ru.md
vendored
57
translations/README-ru.md
vendored
@ -1806,3 +1806,60 @@ NameError: name 'e' is not defined
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
### ▶ Загадочное преобразование типов ключей
|
||||
<!-- Example ID: 00f42dd0-b9ef-408d-9e39-1bc209ce3f36 --->
|
||||
```py
|
||||
class SomeClass(str):
|
||||
pass
|
||||
|
||||
some_dict = {'s': 42}
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
```py
|
||||
>>> type(list(some_dict.keys())[0])
|
||||
str
|
||||
>>> s = SomeClass('s')
|
||||
>>> some_dict[s] = 40
|
||||
>>> some_dict # Ожидается 2 разные пары ключ-значение
|
||||
{'s': 40}
|
||||
>>> type(list(some_dict.keys())[0])
|
||||
str
|
||||
```
|
||||
|
||||
#### 💡 Объяснение:
|
||||
|
||||
* И объект `s`, и строка `"s"` хэшируются до одного и того же значения, потому что `SomeClass` наследует метод `__hash__` класса `str`.
|
||||
* Выражение `SomeClass("s") == "s"` эквивалентно `True`, потому что `SomeClass` также наследует метод `__eq__` класса `str`.
|
||||
* Поскольку оба объекта хэшируются на одно и то же значение и равны, они представлены одним и тем же ключом в словаре.
|
||||
* Чтобы добиться желаемого поведения, мы можем переопределить метод `__eq__` в `SomeClass`.
|
||||
```py
|
||||
class SomeClass(str):
|
||||
def __eq__(self, other):
|
||||
return (
|
||||
type(self) is SomeClass
|
||||
and type(other) is SomeClass
|
||||
and super().__eq__(other)
|
||||
)
|
||||
|
||||
# При переопределении метода __eq__, Python прекращает автоматическое наследование метода
|
||||
# __hash__, поэтому его нужно вручную определить
|
||||
__hash__ = str.__hash__
|
||||
|
||||
some_dict = {'s':42}
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
```py
|
||||
>>> s = SomeClass('s')
|
||||
>>> some_dict[s] = 40
|
||||
>>> some_dict
|
||||
{'s': 40, 's': 42}
|
||||
>>> keys = list(some_dict.keys())
|
||||
>>> type(keys[0]), type(keys[1])
|
||||
(__main__.SomeClass, str)
|
||||
```
|
||||
|
||||
---
|
||||
|
Loading…
Reference in New Issue
Block a user