Однострочный возврат Python ведет себя иначе, чем код с несколькими строками

Предполагая уникальный индекс в столбце Column1 , вы можете использовать выражение DCount, чтобы определить, есть ли у вас нуль или одна строка с Column1 = 'SomeValue' . Затем INSERT или UPDATE на основе этого числа.

If DCount("*", "Table1", "Column1 = 'SomeValue'") = 0 Then
    Debug.Print "do INSERT"
Else
    Debug.Print "do UPDATE"
End If

Я предпочитаю этот подход для первой попытки INSERT, захвата ошибки нарушения ключа 3022 и выполнения UPDATE в ответ к ошибке. Однако я не могу претендовать на огромные выгоды от моего подхода. Если ваша таблица содержит поле автонабора, то отказ от неудачного INSERT остановит вас на ненужном расходовании следующего значения автонабора. Я также могу избежать создания строки INSERT, когда это не нужно. В Access Cookbook сказано, что строковая конкатенация - это умеренно дорогая операция в VBA, поэтому я ищу возможности избежать создания строк, если они на самом деле не нужны. Этот подход также позволит избежать блокировки для ненужного INSERT.

Однако ни одна из этих причин не может быть очень привлекательной для вас. И, честно говоря, я думаю, что мое предпочтение в этом случае может быть о том, что «чувствует себя правильно» для меня. Я согласен с этим комментарием @ David-W-Fenton на предыдущий вопрос о переполнении стека : «Лучше писать свой SQL, чтобы вы не пытались добавьте уже существующие значения, т. е. предотвратите ошибку в первую очередь, а не в зависимости от механизма базы данных, чтобы спасти вас от вас. "

0
задан astro123 18 March 2019 в 15:27
поделиться

1 ответ

Это

    if n not in memo:
        memo[n] = func(n)
    return memo[n]

не то же самое, что

    return func(n) if n not in memo else memo[n]

Однострочник не изменяет содержание заметки. Если вы хотите сравнить яблоки с яблоками, попробуйте:

    if n not in memo:
        return func(n)
    return memo[n]

Для оптимизации вашего однострочного и сохранения значения словаря, вы должны изменить однострочное на:

    return memo[n] if n in memo else memo.setdefault(n, func(n))

Помимо изучения того, как работает memize, вы должны изучить использование functools lru_cache memoize, которое «написано на C и будет намного быстрее, чем все, что вы можете воспроизвести в Python».

meowgoesthedog, chepner & amp; FHTMitchell.

0
ответ дан Scott Skiles 18 March 2019 в 15:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: