Python
Материал из Xgu.ru
[править] Интересные возможности и инструменты языка
- itertools
- functools
- generators
- continuations
[править] Вопросы и ответы
(всякая неотсортированная информация)
[править] Сколько процентов кода покрывать юнит-тестами?
- Unittest in Python (англ.) Pickle Usage Example
[править] Можно ли использовать имена переменных в строковой интерполяции?
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
Подробнее:
- http://www.noah.org/wiki/Pexpect
- pexpect Exit Status (англ.)
- Module pexpect (англ.)
[править] Зачем нужен 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
Подробнее:
- PEP 343, the "with" statement (англ.)
- What is the python “with” statement designed for? (англ.)
- Understanding Python's "with" statement (англ.)
- Python's with statement (англ.)
- (Launchpad-dev) The with statement (англ.)
Ещё надо разобраться с понятием contextmanager, поскольку оно имеет к with самое непосредственное отношение:
[править] Как замерить производительность программы?
Собрать статистику:
python -m cProfile -o prg.profile your-program.py
Проанализировать собранные данные:
python -m pstats prg.profile
Внутри анализатора:
% sort time % stats 10
Визуальный просмотрщик статистики: RunSnakeRun.
Дополнительная информация:
- Handy Python profiling analysis with pstats' interactive browser (англ.)
- The Python Profilers (англ.)
[править] Как создавать постоянные (persistent) объекты в Python?
- pickle/cpickle
- marshal
- shelve
- json
- jsonpickle
- xml
- database (like SQLite)
Не такой популярный, но всё равно полезный метод:
- yserial (англ.)
Дополнительная информация:
[править] Как создать хэш функций с помощью классов?
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
Дополнительная информация:
- Python: dictionary of functions (англ.)
[править] Как организовать случайный выбор слова из взвешенного словаря?
Если в словаре пары
слово => вес ,
то случайный выбор слова с вероятностью пропорциональной его весу можно сделать так (идея взята отсюда [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
[править] Что такое декоратор?
Декоратор -- это вещь.
- Decorators I: Introduction to Python Decorators (англ.)
- PEP-0318: Decorators for Functions and Methods (англ.)
- Function Decorator (англ.) -- small introduction into the topic
- Charming Python: Decorators make magic easy (англ.)
- PythonDecorators (англ.)
- PythonDecoratorLibrary (англ.)
- A brief Python decorator primer (англ.)
- Python 2.4 Decorators (англ.)
[править] Как построить граф зависимостей между функциями и между модулями?
- Generating Python Module Dependency Graphs (англ.)
- snakefood: Python Dependency Graphs (англ.)
- Python Call Graph (англ.) - finding dependencies between functions
- Python Call Graphs + UnitTesting (англ.)
[править] Продолжение вопроса. Как выполнить трассировку вызовов функций?
- Tracing function calls using Python decorators (англ.)
- trace — Trace or track Python statement execution (англ.)
[править] Когда выполняешь тестирование, можно ли подменять функции или классы и подсовывать нужные результаты?
Да, можно. Есть несколько модулей для этого, например 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]
[править] Как правильно оформлять код?
- Style Guide for Python Code (англ.)
[править] Что ещё можно почитать?
- The Python getattr Function (англ.)
- Python's Super is nifty, but you can't use it (англ.) --- why superclasses in python are not so good
- Python Superclass Reflection (англ.)
- Sorting Mini-HOWTO (англ.)
[править] Как посмотреть список доступных модулей?
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].
[править] Как создать программу-демон?
- Creating a daemon the Python way (англ.)
- Daemon processes on windows (англ.)
[править] Как писать низкоуровневые приложения для работы с сокетами?
Для начала почитать:
- Socket Programming HOWTO (англ.)
Для асинхронной обработки:
- select – Wait for I/O Efficiently (англ.)
- select — Waiting for I/O completion (англ.)
И нужно посмотреть такие вещи как Twisted, тогда низкоуровевые решения на уровне select.select/select.poll могут показаться уж слишком низкоуровневыми.
[править] Как сгенерировать случайную строку?
''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(N))
[править] Как изменить стандартный поток вывода для С-функций?
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].
[править] Дополнительная информация
[править] Общая информация
- http://docs.python.org/ -- Python Documentation
- Python Library Reference (англ.)
- Dive Into Python (англ.)
- Dive Into Python 3 (англ.)
- ASPN : Python (англ.)
- Python 2.5 Quick Reference (англ.)
- Python Idioms and Efficiency (англ.)
- Учебник Python 2.6 (рус.)
- Python. Лекции(рус.)
[править] Обработка исключений
- Python Exception Handling Techniques (англ.) --- обработка исключений в Python
[править] Listings
- http://code.activestate.com/recipes/langs/python/ -- более 2,5 тыс. готовых программ на любой вкус
[править] Математические вычисления
[править] Дискретная математика
- Теория графов (модули)
- 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
- Теория графов (реализация, алгоритмы)
- Шаблоны Python - реализация графов -- пример реализации графов через словари
- Лекция 4: Объектно-ориентированное программирование -- пример реализации графов через множества
- Simple tree using a Python dictionary
[править] Элементы функционального программирования
- Functional Programming HOWTO (англ.) — введение в функциональное программирование на Python. Рассказывает о том, что такое итераторы, генераторы, generator expressions, list comprehensions и тому подобное
- MapReduce at Outgoing blog (англ.)
- MapReduce: Simplified Data Processing on Large Clusters (англ.)
[править] Объектно-ориентированное программирование
- Python ООП – это здорово (рус.)
- Объектно-ориентированное программирование на Питоне (рус.)
- http://effbot.org/pyfaq/how-do-i-copy-an-object-in-python.htm (англ.) — заметка о "правильном" копировании объектов
[править] Интерактивный интерпретатор и iPython
- rlcompleter Completion function for GNU readline (англ.)
- http://ipython.scipy.org/moin/Documentation (англ.)
- IPython: a system for Interactive Scientific Computing (англ.) — ещё про iPython
[править] Работа с датой и временем
- http://pleac.sourceforge.net/pleac_python/datesandtimes.html
- http://forum.script-coding.info/viewtopic.php?pid=2993 Поваренная книга Python на русском
[править] Работа с Unicode
[править] Работа с базами данных
[править] SQLite
[править] Работа с XML
[править] Обработка текста
- http://koldunov.net/?p=195 - Форматирование вывода в Python
- http://www.ibm.com/developerworks/ru/library/l-python5/index.html - Текстовая обработка в языке Python
- http://netsago.org/ru/docs/1/8/ - библиотека pyparsing (перевод статьи «Building Recursive Descent Parsers with Python», автор Paul McGuire)
- http://sovety.blogspot.com/2009/07/easy-parsing-in-python.html - еще один пример использования pyparsing
- http://pyparsing.wikispaces.com/HowToUsePyparsing - Using the pyparsing module
- http://gnosis.cx/TPiP/ - Книга Text Processing in Python Девида Мерца
[править] Работа с графами
- A Python Graph API? (англ.) --- обзор того, какие программы есть на сегодня для работы с графами
[править] Работа с внешними процессами
[править] Работа с тредами
- threading — Higher-level threading interface (англ.) @python.org
- threading – Manage concurrent threads (англ.) @doughellmann.com
- Thread Synchronization Mechanisms in Python (англ.) @effbot.org
- Get data from thread (англ.) @daniweb.com — как получить данные из треда
[править] Сборка
- Distribute [10]
- Buildout
- Scons
- http://wiki.python.org/moin/ConfigurationAndBuildTools
[править] Интеграция с другими языками
[править] Си
[править] Повышение скорости исполнения
[править] Документирование
- Docstring Conventions (англ.)
[править] Стиль
[править] Заметки о языке
- Python: Myths about Indentation (англ.) — рассуждение о том, что отступы в Python это очень хорошо
[править] Юмор
По музыкальной классификации языков[2] Python можно сравнить с NDH (Neue Deutsche Härte) и немецкими маршами.
[править] Разное
- http://python.su/blog/public/2008/09/17/zaschita-ot-duraka-v-programmah-na-yazyike-python/ - Защита от "дурака" в программах на языке Python
- http://www.ragbag.ru/2006/12/25/10_python_pitfalls/ - 10 ловушек в Python (10 Python pitfalls)
- http://python.su/blog/public/2008/09/16/rabota-s-fajlami/ - Работа с файлами
- What Not To Do When Writing Python Software (англ.)