Size: a a a

2021 June 09

RT

Roman Tsaregorodtsev in SPb Python
Как может быть такая ситуация? Просто мне ломает мозг именно несоответствие поведения стандартных классов и датаклассов, которые ведут себя получается больше похожими на namedtuple в этом плане, чем на классы
источник

DA

Dmitry Alimov in SPb Python
они и правда похожи на namedtuple. только последние иммутабельные)
источник

АК

Артур Короткий... in SPb Python
ну еще есть момент что dataclass занимает места в оперативке намного меньше чем стандартный класс
источник

DA

Dmitry Alimov in SPb Python
ну к примеру воспользовавшись знанием что hash(-1) == -2
from dataclasses import dataclass

@dataclass(frozen=True)
class B:
   a: int
   b: int

print(hash(B(0, -1)) == hash(B(0, -2)))
источник

DA

Dmitry Alimov in SPb Python
то есть из-за того что __eq__ неявно заюзал __hash__ получилась фигня
источник

RT

Roman Tsaregorodtsev in SPb Python
Только вот это наоборот подтверждает то, что как это сделано в датаклассах не гуд и если бы мы использовали id объекта, то всё было бы нормально
источник

RT

Roman Tsaregorodtsev in SPb Python
мы ведь не хотим, чтобы у нас два объекта имели одинаковый хэш при разных значениях атрибутов
источник

DA

Dmitry Alimov in SPb Python
к сожалению, объекты могут переиспользовать память и завязка на адрес не гарантирует уникальность.
источник

RT

Roman Tsaregorodtsev in SPb Python
Так а что тогда уникальность, если не уникальность по ссылке? имхо вот такое поведение нифига не ожидаемое поведение при работе с объектами)

@dataclass(frozen=True)
class B:
   a: int
   b: int

if __name__ == '__main__':
   b1 = B(0, -1)
   b2 = B(0, -1)
   print(b1 is b2) # False
   print(hash(b1) == hash(b2)) # True
   d = {b1: "key"}
   print(b2 in d) # True
источник

DA

Dmitry Alimov in SPb Python
с точки зрения хэш таблицы — всё верно. здесь и hash-и и данные равны. поэтому b2 найден в d.
но да если бы нужно было завязка на то что b2 это новый инстанс — то надо было бы добавить id в хэш).
источник

RT

Roman Tsaregorodtsev in SPb Python
Это, кстати, касается и tuple и namedtuple. Так что если воспринимать dataclass как накрутку над namedtuple, а не над классами, то мозгу становится чуть легче
источник

DA

Dmitry Alimov in SPb Python
в данном случае похоже нужно использовать не датаклассы, ну либо добавлять какой-то допольнительный пораметр типа счётчика
источник

RT

Roman Tsaregorodtsev in SPb Python
В общем, learned something new today. Спасибо
источник

DA

Dmitry Alimov in SPb Python
круто! и тебе спасибо!
а я полез смотреть в исходники dataclasses.py 🤯
источник

RT

Roman Tsaregorodtsev in SPb Python
Я пробежался, но ничего интересного не нашел. Только таблицу как они добавляют хэшируемость взависимости от тех или иных параметров
источник

DA

Dmitry Alimov in SPb Python
ага, интересно сделано, я понял как хэш от датакласса расчитывается.
если нет полей то __hash__ = hash(())
а если есть например a и b, то __hash__ = hash((self.a, self.b)). то есть так же как и от tuple и как от namedtuple ;)
источник

DS

David Shiko in SPb Python
Всем привет!
Подскажите пожалуйста как прервать текущий event loop по внешнему событию?
Я делаю живой поиск и у меня есть ендпойнт на вебсокете, он по факту прослойка между юзером и БД. Как только приходят новые данные от юзера, -старый запрос к БД нужно прекратить (на любой стадии).

@router.websocket(path="")
async def websocket_endpoint(
       websocket: WebSocket,
       postgres_session=Depends(database.get_db),
):
   try:
       await ws_manager.connect(websocket)
       while True:
           data = await websocket.receive_text()  # TODO stop execution if new data
           result = crud.search(...)
           return await websocket.send_text(result)
   except WebSocketDisconnect:
       ws_manager.disconnect(websocket)
источник

SK

Sergio Keler in SPb Python
зачем прекращать? пусть отработает. можно просто игнорировать результат и всё.
источник

SK

Sergio Keler in SPb Python
ну или закрой сокет... пфф..
нет сокета, нет запроса. профит!
источник

DS

David Shiko in SPb Python
Тогда смысл теряется, открытие сокета - это точно такой же http запрос, т.е. толку от ВС не будет
источник