Pull to refresh
579
0
Александр Гончаров @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.

1
23 ...

Information

Rating
Does not participate
Registered
Activity

Specialization

Backend Developer
From 750,000 ₽
Python