arilou: (Default)
Нужно мне иметь небольшой файлик данных, вполне достаточно формата ключ-значение.
Ставить ради этого какую-то "серьёзную" базу данных лениво и вряд ли нужно. И sqlite не хочется, потому что лишний слой sql-запросов мне тут нафиг не нужен.
Дикого быстродействия не требуется.
Но и просто вариант текстового файла, перезаписываемого каждый раз целиком, думаю, уже не годится.
Смотрю, что есть в питоне... dbm, gdbm, bsddb (и dbhash поверх него).
В простейшем случае, наверное, можно брать что угодно.
Но всё же, есть ли какие соображения за/против?
arilou: (Default)
А кто что скажет про такой способ недопущения запуска второго экземпляра процесса? (При условии, что у меня нет потребности извне узнавать PID уже запущенного экземпляра.)
import socket
import sys
import time

def get_lock(process_name):
    global lock_socket   # Without this our lock gets garbage collected
    lock_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
    try:
        lock_socket.bind('\0' + process_name)
        print 'I got the lock'
    except socket.error:
        print 'lock exists'
        sys.exit()

get_lock('running_test')
while True:
    time.sleep(3)

О том, что это Linux specific, я уже прочитал.
arilou: (Default)
Вот что меня удивляет в синтаксисе питона, так это почему внутри конструкци итератора (оно же list comprehension) в случае "многоэтажного" цикла самым внешним оказывается самый левый, а не самый правый цикл.
При том, что в случае одиночного цикла этот цикл заключает в себе стоящее слева выражение, было бы логично, чтобы при двух циклках правый заключал в себе левый (а тот, в свою очередь, так же заключал в себе стоящее слева выражение).
arilou: (Default)
Вот такая задачка:
Есть некий скрипт, писанный на питоне, крутится более-менее постоянно (под screen).
Обощённо цикл работы состоит из проверки, не пришли ли "данные" для обработки, и если пришли -- происходит довольно долгая (десятки минут) обработка.
Захотелось его перезапускать для обновления, не ловя момент окончания обработки.

Простейшие варианты:

1) Функции семейства os.exec* -- успешно подменят старый процесс новым, всё замечательно, но если новый почему-либо не стартует, то это надо заметить, потом исправить -- только тогда работа продолжится.

2) Вызвать новый скрипт через subprocess.Popen, убедиться, что он нормально взлетел, после чего завершить старый. Исправляет недостаток первого пункта, но новый скрипт, используя ту же "консоль" (те же stdin/stdiut, stderr), при этом выпадает из jobcontrol'а, т.е. крутится в фоне по отношению к шеллу, из которого был запущен старый скрипт, а из старого мы попадаем обратно в шелл. И при том отт фоновый новый скрипт не может подхватить команда fg.

Есть ли способ избавиться от недостатков обоих методов, не выделяе контроль за перезапуском в отдельный процесс?
Кроссплатформенности от данного механизма (пока?) не требуется.

(На крайняк мне пока годится первый вариант, поскольку перезапуски пока что как правило контролируются вручную, да и короткий даунтайм в общем-то не страшен. Но всё же интересно, может, есть простое решение?)
arilou: (Default)
Видим в чужом коде такую функцию и ужасаемся:
def reprList( _list, divider=',' ):
    param_string = ""
    if _list:
        for val in _list:
            param_string += repr(val) + divider
        return param_string[:-(len(divider))]
    return param_string

Тут же делаем свой вариант, который и короче, и понятнее:
def reprL( list_, divider=',' ):
    return divider.join(repr(val) for val in list_)


Затем берём модуль timeit, пробуем на нескольких примерах, и радость наша сменяется озадаченностью:
Read more... )
arilou: (Meditate)
В каждом файле явно указывать, что у меня UTF-8, задалбывает. Барлог меня побери, второе десятилетие 21-го века!
Не, я понимаю. соображения совместимости и т.п.. Но хотя бы BOM в начале файла можно было научиться понимать...
arilou: (Default)
Недели полторы назад меня что-то вштырило покопаться в сравнении скоростей форматирования строк в питоне. (Посты на DW тут и тут, в ЖЖ тут и тут.) [Непрограммистам врядли интересно, куча строк кода и чисел.]

Вполне ожидал, что кто-то из более опытных в питоне товарищей тут же мне укажет, где и в чём я не так понимаю питон, ну или просто на какое-то упущение. Никто не сказал ничего. Теша себя надеждой, что это всё была не настолько ахинея, а просто пост пришёлся не вовремя, заглядывать или отвечать на него всем оказалось некогда, снова поднимаю этот вопрос. Так что если есть у кого что сказать -- с интересом почитаю.
arilou: (Default)
В продолжение предыдущего поста
Взявшись убрать из кода пару-тройку свеже вписанных str.format, задумался и о скорости сцепки коротких строк.
Read more... )
arilou: (Default)
Задумавшись вдруг, а какой тип подстановки данных в строку использовать, старый (через %) или новый (через str.format) попробовал сравнение для простых случаев.
Read more... )

P.S.: Критерий "кому как больше по вкусу" сознательно не рассматривался.
arilou: (Default)
Прочитав, что в питоне проверка на наличие у объекта требуемого атрибута реализована через вызов метода получения значения атрибута и ловлю бросаемого им исключения, не мог не вспомнить упомянутый анекдот.
Особенно при том, что одно из очевидных применений -- это как раз проверка перед получением значения:
if hasattr(a, 'property'):
    do_something(a.property)


По-моему, какая-то противоестественная логика. Ну да, hasattr() избавляет нас от писания кода ловли исключения. Но всё-таки не слишком ли дофига лишних действий на этапе выполнения?

Profile

arilou: (Default)
Danil "Eleneldil G. Arilou" Lavrentyuk

February 2017

S M T W T F S
   1 234
567891011
12131415161718
19202122232425
262728    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 28th, 2017 04:47 pm
Powered by Dreamwidth Studios