Python

Материал из Xgu.ru

Перейти к: навигация, поиск

Содержание

[править] Интересные возможности и инструменты языка

  • itertools
  • functools
  • generators
  • continuations

[править] Вопросы и ответы

(всякая неотсортированная информация)

[править] Сколько процентов кода покрывать юнит-тестами?

[править] Можно ли использовать имена переменных в строковой интерполяции?

var1=10
var2=20
print "var1 = %(var1)s; var2 = %(var2)s" % locals()

[править] Как создать пары из списка?

   t = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')
   zip(t[::2], t[1::2])

[править] Что будет если изменить аргумент функции, когда в нём находится значение по умолчанию?

Если это изменяемый объект (в частности, список, словарь), то он изменится.

>>> def function(data=[]):
...     data.append(1)
...     return data
...
>>> function()
[1]
>>> function()
[1, 1]
>>> function()
[1, 1, 1]

Подробнее: [1].

[править] Как правильно узнать имя текущего пользователя?

   def get_username():
       return pwd.getpwuid( os.getuid() )[ 0 ]

Или:

   def get_username():
       return pwd.getpwuid( os.geteuid() )[ 0 ]

Другие способы: [2].

[править] Как нынче правильно считывать данные из внешних программ?

Другими словами, как правильно организовывать pipe?

Раньше для этого можно было использовать функции popen, popen2, popen3 и тому подобные. Сейчас лучше использовать модуль subprocess. Его использовать и проще, и нагляднее.

import subprocess

print '\npopen3:'
proc = subprocess.Popen('cat -; echo ";to stderr" 1>&2',
                        shell=True,
                        stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE,
                        )
stdout_value, stderr_value = proc.communicate('through stdin to stdout')
print '\tpass through:', repr(stdout_value)
print '\tstderr:', repr(stderr_value)

Дополнительная информация:

[править] А если нужно не только считывать, но и записывать данные, то есть организовать диалог с программой?

Да, есть модули, обладающие функциональностью наподобие expect. Например, модуль pexpect.

   import pexpect
   child = pexpect.spawn ('ftp ftp.openbsd.org')
   child.expect ('Name .*: ')
   child.sendline ('anonymous')
   child.expect ('Password:')
   child.sendline ('noah@example.com')
   child.expect ('ftp> ')
   child.sendline ('cd pub')
   child.expect('ftp> ')
   child.sendline ('get ls-lR.gz')
   child.expect('ftp> ')
   child.sendline ('bye')

Читать данные, которые передаются программе или программой:

    child.logfile_read = sys.stdout
    child.logfile_send = sys.stdout

Или объединённый:

    child.logfile = sys.stdout


Подробнее:

[править] Зачем нужен with?

with это хитрая вещь, которая позволяет значительно сократить конструкции такого вида

con1 = users_db(uid)
con2 = users_db(uid)

con1.startTransaction()
con2.startTransaction()

try:
    con1.delete('foo', id=1)
    con2.delete('bas', id=1)
except:
    con1.rollback()
    con2.rollback()
    raise
else:
    con1.commit()
    con2.commit()

до такого:

con1 = users_db(uid)
con2 = users_db(uid)

with transaction(con1, con2):
    con1.delete('timelines', id=1)
    con2.delete('timelines', id=1)

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

Эта задача возлагается на плечи функции (или класса), который передаётся в качестве аргумента with.

With автоматически позаботится о том, чтобы выполнить закрывающую часть функции, даже если with покинули из-за исключения или как-то иначе:

@contextmanager
def for_with():
    try:
        print 1
        yield
    finally:
        print 3

def func():
    with for_with():
        print 2
        return False

Подробнее:

Ещё надо разобраться с понятием contextmanager, поскольку оно имеет к with самое непосредственное отношение:

[править] Как замерить производительность программы?

Собрать статистику:

 python -m cProfile -o prg.profile your-program.py

Проанализировать собранные данные:

 python -m pstats prg.profile

Внутри анализатора:

 % sort time
 % stats 10

Визуальный просмотрщик статистики: RunSnakeRun.

Дополнительная информация:

[править] Как создавать постоянные (persistent) объекты в Python?

  • pickle/cpickle
  • marshal
  • shelve
  • json
  • jsonpickle
  • xml
  • database (like SQLite)

Не такой популярный, но всё равно полезный метод:

Дополнительная информация:


[править] Как создать хэш функций с помощью классов?

def cleandict(x):
  for k in ('__module__', '__doc__'):
    del x[k]
  return x

@cleandict
@asdict
class baz:
  def bar(): pass
  def zon(x): return 1+x

Дополнительная информация:

[править] Как организовать случайный выбор слова из взвешенного словаря?

Если в словаре пары

 слово => вес ,

то случайный выбор слова с вероятностью пропорциональной его весу можно сделать так (идея взята отсюда [3], только у них список пар, а у нас словарь):

#!/usr/bin/python

import random

dict = {
    'a'     : 50,
    'b'     : 50,
    'c'     : 100,
}

def wrandom(dict):
    total = sum(dict.values())
    n = random.uniform(0, total)

    for key in sorted(dict.keys()):
        item = key
        if n < dict[key]:
            break
        n -= dict[key]

    return item

for i in range(20000):
    print wrandom(dict)

Проверка:

$ python random-dict.py | sort | uniq -c
   5098 a
   5045 b
   9857 c

[править] Что такое декоратор?

Декоратор -- это вещь.

[править] Как построить граф зависимостей между функциями и между модулями?

[править] Продолжение вопроса. Как выполнить трассировку вызовов функций?

[править] Когда выполняешь тестирование, можно ли подменять функции или классы и подсовывать нужные результаты?

Да, можно. Есть несколько модулей для этого, например mocker.

Дополнительная информация:

[править] Можно ли использовать монады в питоне?

Можно, но довольно хитро.

Дополнительная информация:

[править] Как подключиться к HTTPS-серверу из программы на Python?

Используя httplib:

   import httplib
   HOSTNAME = 'login.yahoo.com'
   conn = httplib.HTTPSConnection(HOSTNAME)
   conn.putrequest('GET', '/')
   conn.endheaders()
   response = conn.getresponse()
   print response.read()

Подробнее: [4].

Используя urllib2:

f = urllib2.urlopen('https://localhost/page.html')
f.read()

Если нужно ещё аутентификацию:

import urllib2
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='REALM',
                          uri='https://localhost:19080/',
                          user='user',
                          passwd='password')
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
f = urllib2.urlopen('https://localhost:19080/login.html')
f.read()

Подробнее: [5]

[править] Как правильно оформлять код?

[править] Что ещё можно почитать?

[править] Как посмотреть список доступных модулей?

help('modules')

Если есть pip:

pip freeze

[править] Есть какой-то хороший curses-тулкит для Python?

Например, Urwid

[править] А под Windows какие отличия?

Много.

[править] Как определить, сколько свободного места на диске?

import os
import platform
import ctypes

def get_free_space(folder):
    """ Return folder/drive free space (in bytes)
    """
    if platform.system() == 'Windows':
        free_bytes = ctypes.c_ulonglong(0)
        ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(folder), None, None, ctypes.pointer(free_bytes))
        return free_bytes.value
    else:
        return os.statvfs('/folder').f_bavail*os.statvfs('/folder').f_bsize #к-во доступных пользователю блоков*размер блока

Источник: [6]

[править] Можно ли с помощью ctypes вызывать функции из DLL Windows?

Вообще, с помощью ctypes и windll можно делать довольно много всего, что просто так сделать в Windows довольно тяжело. Например, даже такая простая вещь как найти полный путь программы (аналог which) в самой по себе Windows сделать сложно, но с помощью python + ctypes + windll очень легко.

import ctypes

def which(program):
    path = ctypes.create_unicode_buffer(1024)
    ctypes.windll.shell32.FindExecutableW(
        ctypes.c_wchar_p(program),
        None,
        ctypes.pointer(path)
    )
    return path.value

print which('explorer')

Другие примеры использования смотрите, например, здесь [7].

[править] Как создать программу-демон?

[править] Как писать низкоуровневые приложения для работы с сокетами?

Для начала почитать:

Для асинхронной обработки:

И нужно посмотреть такие вещи как Twisted, тогда низкоуровевые решения на уровне select.select/select.poll могут показаться уж слишком низкоуровневыми.

[править] Как сгенерировать случайную строку?

''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(N))

[8]

[править] Как изменить стандартный поток вывода для С-функций?

import zook
import os
import sys

def redirect_stdout():
    print "Redirecting stdout"
    sys.stdout.flush() # <--- important when redirecting to files
    newstdout = os.dup(1)
    devnull = os.open('/dev/null', os.O_WRONLY)
    os.dup2(devnull, 1)
    os.close(devnull)
    sys.stdout = os.fdopen(newstdout, 'w')

zook.myfunc()
redirect_stdout()
zook.myfunc()
print "But python can still print to stdout..."

[править] Как сделать карриинг функции?

class curry:
    def __init__(self, fun, *args, **kwargs):
        self.fun = fun
        self.pending = args[:]
        self.kwargs = kwargs.copy()

    def __call__(self, *args, **kwargs):
        if kwargs and self.kwargs:
            kw = self.kwargs.copy()
            kw.update(kwargs)
        else:
            kw = kwargs or self.kwargs

        return self.fun(*(self.pending + args), **kw)

Connect = curry(ODBC.Connect, dsn='MyDataSet')

Подробнее: [9].

[править] Можно ли делать замыкания (closures) в Python?

Без проблем, но есть некоторые ньюансы[1].

[править] Дополнительная информация

[править] Общая информация

[править] Обработка исключений

[править] Listings

[править] Математические вычисления

[править] Дискретная математика

  1. Теория графов (модули)
    • python-graph -- is a library for working with graphs in Python
    • NetworkX -- is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks (можно получать красивые картинки)
    • Graphine -- is a flexible, easy-to-use graph library for Python 3
  2. Теория графов (реализация, алгоритмы)

[править] Элементы функционального программирования

[править] Объектно-ориентированное программирование

[править] Интерактивный интерпретатор и iPython

[править] Работа с датой и временем

[править] Работа с Unicode

[править] Работа с базами данных

[править] SQLite

[править] Работа с XML

[править] Обработка текста

[править] Работа с графами

  • A Python Graph API? (англ.) --- обзор того, какие программы есть на сегодня для работы с графами

[править] Работа с внешними процессами

[править] Работа с тредами

[править] Сборка

[править] Интеграция с другими языками

[править] Си

[править] Повышение скорости исполнения

[править] Документирование

[править] Стиль

[править] Заметки о языке

[править] Юмор

По музыкальной классификации языков[2] Python можно сравнить с NDH (Neue Deutsche Härte) и немецкими маршами.

[править] Разное

[править] Примечания

  1. http://me.veekun.com/blog/2011/04/24/gotcha-python-scoping-closures/
  2. http://piranha.org.ua/blog/2008/05/10/musical-languages/
Источник — «http://xgu.ru/wiki/Python»