Ответы пользователя по тегу Python
  • Python delite Python delite?

    есть несколько вариантов, но остановитесь на этом:
    globals()['b'] = 2
    print(b)

    а ещё лучше заведите словарик:
    d = {}
    d['b'] = b
    print(d['b'])


    з.ы. о динамическом создании локальных переменных лучше сразу забыть
    Ответ написан
    1 комментарий
  • Странное поведение pycharm?

    сталкивался с подобным, и тут не столько пайчарм виноват, вопрос в том в какой кодировке выводится информация, если консоль для вывлда на текущий момент не юникодовая, тут и начинаются такие проблемы.
    гляньте что вам вернёт:
    import sys, locale, os, codecs 
    print(sys.stdout.encoding)
    print(sys.stdout.isatty())
    print(locale.getpreferredencoding())
    print(sys.getfilesystemencoding())
    Ответ написан
    Комментировать
  • Какую среду выбрать Matlab vs Mathematica vs Maple vs python?

    за первые 3 пункта ничего вам не скажу, по 4-му:
    bender.astro.sunysb.edu/classes/python-science
    www.astro.cornell.edu/staff/loredo/statpy
    собственно питон в этой области популярен не потому что он питон, а из-за существующих инструментов, уже на которые ложится пайтон, со всем тем за что его любят и не любят
    Ответ написан
    Комментировать
  • Как сделать глобальный Enum в Python 2.7?

    как таковые родные перечисления появились только в 3,4, но есть бэкпорт https://pypi.python.org/pypi/enum34 вплоть до 2,4
    Но вполне возможно вам хватит и атрибутов класса?
    class A(object):
        B = 0
    print A.B  # 0
    Ответ написан
    2 комментария
  • Как создавать namedtuple с динамичным количеством полей?

    Если вы заранее знаете какие поля обязательно будут и вас интересуют только они, почему просто не создать собственный класс с этими параметрами, __init__ которого будет принимать на вход эти параметры в нужном порядке, и *args - в который попадёт всё остальное, что при желании можно сохранить или проигнорировать.
    если волнует выделение памяти используйте __slots__
    Ответ написан
    Комментировать
  • Как надо и как не надо использовать менеджеры контекстов?

    Собственно очевидные варианты, работа с ресурсами - файлы. конекты к бд, они уже все готовы для работы с менеджерами контекста.

    допустим так: Как мониторить медленные и прожорливые места скрипта?

    как видится мне:
    • Использовать для гарантии выполнения каких либо действий, после определённого участка кода, даже если в нём произошли исключения, код с менеджерами в этом случае выглядит гораздо компактнее
    • Использовать как некое подобие декоратора, но не для функции, а для произвольных участков кода, их можно добавить можно убрать, функциональность обёртываемого кода при этом не меняется.
    Ответ написан
    1 комментарий
  • Как мониторить медленные и прожорливые места скрипта?

    потребление памяти: https://pypi.python.org/pypi/memory_profiler

    Для замера времени выполнения в боевых условиях использую обычно такой менеджер контекста:
    class Profiler(object):
        def __init__(self, message_format='Elapsed time: {:.3f} sec'):
            self._message_format = message_format
    
        def __enter__(self,):
            self._startTime = time.time()
    
        def __exit__(self, rtype, value, traceback):
            print(self._message_format.format(time.time() - self._startTime))


    использовать крайне просто:
    with Profiler():
        <код время выполнения которого необходимо замерить>

    1. Код программы почти не нуждается в изменении.
    2. минимальные накладные расходы(крайне важно поскольку "нормальные" профилировщики сильно всё затормаживают, но и выдают гораздо более детальную информацию)
    3. замерит время в любом случае, если даже произойдёт исключение.
    4. аналогичную конструкцию(с минимальными изменениями для работы с logging) использую и в продакшене.
    Ответ написан
    Комментировать
  • Почему выходит AttributeError: type object 'Classics' has no attribute 'Classes'?

    совершенно спокойно, в одном случае динамически был создан данный атрибут, в другом случае никто его не создал, вот его и нет.
    Небольшой совет, лучше всего все(если есть такая возможность) используемые атрибуты класса явно задавать внутри __init__, инициализируя либо пустыми значениями, либо значениями по умолчанию.
    Ответ написан
  • Почему программа так долго обрабатывает данные?

    Проблема не в циклах, проблема в самом модуле python-docx именно он работает медленно, то как вы к ячейкам обращаетесь в итоге приводит к созданию кучи временных объектов.

    так будет значительно быстрее:
    student =  [cell.paragraphs[-1].text for cell in doc1.tables[0].column_cells(0)]
    Ответ написан
  • Почему при вынесении из цикла переменной, которая не изменяется вываливается ошибка?

    import urllib, json
    
    url_members = 'https://api.vk.com/method/groups.getMembers?group_id=67824212'
    response_url_members = urllib.urlopen(url_members)
    data = json.loads(response_url_members.read())
    members = data['response']['users']
    print(members)

    в первом варианте у вас три раза запрашивается урл
    во втором урл запрашивается один раз, первый вызов read забирает все данные, и на втором уже убудет пустая строка, которая не является валидным json, отсюда ошибка.
    При этом у вас на каждой итерации цикла вызывается преобразование одних и техже данных в json.
    помимо этого сам цикл вообще бесполезный поскольку в переменную members, будет на каждой итерации записываться значение и затираться следующим, будет проще обратится по индексу сразу. members = data['response']['users'][2]
    Ответ написан
    2 комментария
  • Что написать, чтобы как можно полнее поиграться с coroutines в Python?

    поздновато конечно, но для понимания мне помогли два доклада которые спокойно находятся в интернете:
    [PyCon2008UK] Generator Tricks For Systems Programmers
    [PyCon2009] A Curious Course on Coroutines and Concurrency
    и поидее есть третий, до которого пока так и не дошли руки:
    [PyCon2014] Generators - The Final Frontier
    Ответ написан
    Комментировать
  • Как организовать обработку поля namedtuple при [первом] вызове?

    собственно для выборки чтения из файла csv можно использовать модуль csv (там проблемы с юникодом но вполне решаемые)
    код ниже расчитан на работу в 2,7, с юникодом, поэтому функция intern не используется, но при желании вполне можно добавить в метод to_str
    в целом бы я организовал нечто подобное:
    #!/usr/bin/env python
    # -*- coding: utf-8
    from __future__ import unicode_literals
    from collections import namedtuple
    
    
    def to_int(element):
        """
        Преобразуем строку в число.
        ARGUMENTS:
            :type element: str | unicode
            :rtype: int | long | None
        """
        try:
            # если числа записаны без кавычек
            # return int(element)
            # если при числа всегда обрамлёны кавычками
            return int(element[1:-1])
            # если может быть обрамлён
            # return int(element.strip('"'))
        except ValueError:
            return None
    
    
    def to_str(element):
        """
        обрезаем кавычки
        ARGUMENTS:
            :type element: str | unicode
            :rtype: str | unicode
        """
        # если при этом всегда обрамлён кавычками
        return element[1:-1]
        # если может быть обрамлён
        # return element.strip('"')
    
    
    def to_original(element):
        """
        собственно ничего не делаем со строкой
        ARGUMENTS:
            :type element: str | unicode
            :rtype: str | unicode
        """
        return element
    
    
    # предположим что мы не испольщуем модуль csv
    # а сами всё считываем построчно из файла
    data = {
        '"1";"2";"test\"0";"test1";"123"',
        '"2";"3";"test1";"test2";"234"',
        '"4";"5";"test2";"test3";"345"',
    }
    # описываем какие колонки нас интересуют, и функции которые будут использоваться при их обработке
    column_map = {
        0: to_int,
        2: to_str,
        4: to_original
    }
    XDR = namedtuple('XDR', 'num, string, other')
    #: :type: list[XDR]
    xdrs = list()
    for row in data:
        row_splited = row.split(';')
        xdrs.append(XDR(*(func(row_splited[column]) for column, func in column_map.iteritems())))
    
    print xdrs

    вывод:
    [XDR(num=1, string=u'test"0', other=u'"123"'), XDR(num=2, string=u'test1', other=u'"234"'), XDR(num=4, string=u'test2', other=u'"345"')]
    Ответ написан
  • Как инвертировать словарь без использования дополнительной памяти?

    > Он занимает сотни мегабайт
    вы имеете в виду что данные хранящиеся в словаре занимают сотни мегабайт, или сам объект словаря занимает сотни мегабайт?

    Поскольку от того, что вы инвертируете словарь, копий ключей и значений в памяти не появится, увлечение памяти будет только на саму структуру нового словаря.
    Ответ написан