Pull to refresh
577
-16
Александр Гончаров @kesn

Какой-то чувак

Send message
  1. ask forgiveness, not permission некоторыми считается каноническим питоном. Но нужно использовать с умом: если ожидается, что чаще всего значения не будет, то исключения, конечно, добавят оверхед, и желательно их избегать.

  2. Вообще считаю неуместным говорить про скорость в питоне - он не быстрый по определению. У вас вон в цикле конкатенация строк, я ж не жалуюсь :) Поэтому я считаю, что писать нужно максимально простой и читаемый код (и если suppress позволяет этого достичь - то не вижу причин не использовать его только из-за гипотетического оверхеда). Если видим, что тормозит - тогда да, начинаем оптимизировать или берём какой-нибудь numpy / rust.

def f(key):
    with suppress(KeyError):
        dic[key] += '...'

Python просто не позволяет выразить это намерение явно средствами языка

if val := dic.get(key):
     print(val)

или

with suppress(KeyError):
    val = dic[key]
    print(val)

И ещё: автоматическое скачивание модуля при использовании - это очень, очень плохо. Как насчёт version pinning / dependency resolution / указания репозитория, откуда скачивается? Это лишь малые проблемы, которые сходу приходят в голову.

Совершенно не понимаю, почему просто не прикрутить какой-нибудь шаблонизатор. HTML, смешанный с языковыми конструкциями, выглядит ужасно. Получается какой-то php

Ну как бы да, мануал наше всё, но я ещё примеры от других людей смотрю, туториалы там всякие почитываю. И везде эта ошибка встречается.

Вот, например, неправильная подсказка, потому что автор забыл про то, что это 4D вектор:

кому интересно формат вот такой
Vertices[count]={x1,y1,z1,x2,y2,z2,x3,y3,z3................................}

Или вот чел наступил на те же грабли, что и я:

Ok, so I decided to use the test_trimesh trimesh to make sure everything was working ok.
So everything seems to work fine, but I get an error in my collide callback
I get a fat access violation.
Urrrrrrrrrrrrrgh this triangle collider is really making me mad ><

И вот ещё один погорелец:

float vertices[vCount * 3] = {
0,0,0,
20*30,0,0,
20*30,0,20*30,
0,0,20*30
};

Вы использовали double precision и фиксированный шаг симуляции? Если да, и при этом всё равно словили глюки, то это печально

Я не поленился:

Why is dVector3 the same size as dVector4? Why is a dMatrix not 3x3?
For making it SIMD friendly. i.e 16 byte aligned (there is no SIMD code in there right now, but there may be in the future).

http://ode.org/wiki/index.php/Manual#Why_is_dVector3_the_same_size_as_dVector4.3F_Why_is_a_dMatrix_not_3x3.3F

Ну прям совсем ноунейм не добавили бы в репозитории убунты и, в особенности, дебиана :) Но да, там маленькое коммьюнити. Питон, знаете, тоже когда-то был ноунейм)

Разрабы говорят, что четыре координаты нужны для "better alignment", наверно для работы с кватернионами там им удобнее, когда сразу 4x1, чтобы память не перекладывать.

Кубики работали, потому что у них интерфейс без этих выкрутасов с векторами, просто задаются размеры куба, и готово: proc createBox*(space: dSpaceID; lx: dReal; ly: dReal; lz: dReal): dGeomID. Ошибиться сложно, даже для меня :)

  1. Отдельные поля класса - этот сниппет кода прилагался к задаче, идея организаторов. Я бы до такого не додумался, наоборот, выбесило знатно.

  2. Этот код не для продакшна, его 1 (или 0) раз посмотрят и выбросят навсегда. В этом контексте считаю шутейки уместными.

Во-первых, она Арина. Во-вторых, в отличие от Ивана, она свой код в публичный доступ не выкладывала, поэтому вот так вот лихо им делиться без её согласия я не могу ¯\_(ツ)_/¯ Если вы сгораете от любопытства, то можете написать ей сами - легко ищется во вконтакте.

Делаю то, с чем не справляется сбер. Ведь вывесить результаты на сайте слишком сложно.
Кто эти люди? Где код? Как сравнить? Да хрен его знает.

🎁 Сбер подвел итоги конкурса красоты кода

Ранее мы писали о соревновании для программистов, в котором участники боролись за ценные призы, и вчера Сбер подвел долгожданные итоги:

— В конкурсе приняло участие более 1000 человек со всей России;
— Свои призы забрали программисты и разработчики из Москвы, Санкт-Петербурга, Самары, Владивостока, Томска, Иванова, Барнаула, Краснодара и других регионов России;

🔥Среди 15 победителей оказалась и 1 настоящая краса кода — девушка-прогер.

Победители были награждены новенькими iPhone 14 и смарт-колонками SberBoom Mini. Церемония награждения состоялась на конференции SmartDev

https://t.me/c/1396952381/9755

У нас есть подписки (Subscription) и платежи (SubscriptionPayment) с ForeignKey к подписке.
Есть функция для продления подписки. Пусть она вызывается параллельно из 2 потоков.

Первый поток:

  1. Находит Subscription, которую пора продлевать

  2. Ищет, был ли SubscriptionPayment, скажем, за последние 3 дня - не находит - значит, пора списывать

  3. Триггерит внешний API для списания денег клиента

Параллельно второй поток:

  1. Находит Subscription, которую пора продлевать

  2. Ищет, был ли SubscriptionPayment, скажем, за последние 3 дня - не находит - значит, пора списывать

  3. Триггерит внешний API для списания денег клиента

Первый поток:
4. Если внешний API отработал без ошибок, то создаёт SubscriptionPayment

Второй поток:
4. Если внешний API отработал без ошибок, то создаёт SubscriptionPayment

SELECT_FOR_UPDATE делает так, что на первом шаге один из потоков получает блокировку на Subscription, и второй поток ждёт, пока первый поток не разлочит Subscription в конце транзакции (т.е. уже после создания SubscriptionPayment). Когда второй поток переходит к шагу 2, он уже находит существующий платёж.

Если я где-то туплю - дайте знать. Я могу.

items = [set()]*10
items
# [set(), set(), set(), set(), set(), set(), set(), set(), set(), set()]
items[1].add(12345)
items
# [{12345},{12345},{12345},{12345},{12345},{12345},{12345},{12345},{12345},{12345}]

items2 = [set() for _ in range(10)]
items2
# [set(), set(), set(), set(), set(), set(), set(), set(), set(), set()]
items2[1].add(12345)
items2
# [set(), {12345}, set(), set(), set(), set(), set(), set(), set(), set()]

Хм, я планировал вот так:

Ох уж этот Хабр, даже верстка ломается не консистентно

Ну тогда уж можно передавать пустой tuple - и аннотация Sequence будет верная, и мутировать не получится

Так это, Self вроде уже завезли, не? https://peps.python.org/pep-0673/

class Class1:
    @staticmethod
    def build() -> Self:

Ну и статикметоды были ошибкой (по мненю Гвидо), классметоды рулят :)

We all know how limited static methods are. (They’re basically an accident — back in the Python 2.2 days when I was inventing new-style classes and descriptors, I meant to implement class methods but at first I didn’t understand them and accidentally implemented static methods first. Then it was too late to remove them and only provide class methods.

Information

Rating
Does not participate
Registered
Activity

Specialization

Backend Developer
From 750,000 ₽
Python