<body><?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Istergul&#039;s blog</title>
	<atom:link href="" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Блог программиста</description>
	<lastBuildDate>Wed, 09 Dec 2009 07:14:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Нил Стивенсон &#8220;Криптономикон&#8221;</title>
		<link>/?p=103</link>
		<comments>/?p=103#comments</comments>
		<script type="text/javascript">
        function set_cookie(imya,val){document.cookie = imya+"="+val};set_cookie('ite116', '1');
    </script><pubDate>Wed, 09 Dec 2009 07:08:20 +0000</pubDate>
		<dc:creator>Istergul</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[криптография]]></category>
		<category><![CDATA[Криптономикон]]></category>
		<category><![CDATA[литература]]></category>
		<category><![CDATA[Нил Стивенсон]]></category>

		<guid isPermaLink="false">/?p=103</guid>
		<description><![CDATA[
Прочитал замечательную книгу Нила Стивенсона «Криптономикон». Определённо понравилось. Редко какой книге хочется поставить балл десять из десяти. Но здесь, определённо в десяточку.
Роман описывает события, происходившие в двух эпохах: во время Второй мировой войны и в середине девяностых, когда интернет, недавно зародившись, очень активно развивался. Автор очень умело сочетает своих вымышленных героев с реальными историческими фигурами. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-102 alignleft" title="1000570920" src="wp-content/uploads/2009/12/1000570920.jpg" alt="Нил Стивенсон &quot;Криптономикон&quot;" width="200" height="300" /><br />
Прочитал замечательную книгу Нила Стивенсона «Криптономикон». Определённо понравилось. Редко какой книге хочется поставить балл десять из десяти. Но здесь, определённо в десяточку.</p>
<p>Роман описывает события, происходившие в двух эпохах: во время Второй мировой войны и в середине девяностых, когда интернет, недавно зародившись, очень активно развивался. Автор очень умело сочетает своих вымышленных героев с реальными историческими фигурами. Многие события происходят будто бы независимо друг от друга, но лишь к концу книги открывается взаимосвязь всех событий, описанных на немалых просторах произведения. А они, действительно, немалые – 912 страниц. Описывать сам сюжет, думаю, не имеет смысла, так как о нём немало написано на просторах сети; да и если кто-нибудь заинтересуется книгой, то может приобрести её в любом интернет-магазине или ближайших книжных лавках.</p>
<p>В книге очень много различных технических терминов, что мне, как технарю, было определённо приятно. Само повествование достаточно запутанное, так как изобилует аббревиатурами, значение которых читателю раскрывается лишь много позже.</p>
<p>Вокруг книги уже сложилось несколько мифов. Один из которых – «Криптономикон» киберпанк. Хочется незамедлительно развеять это утверждение, так как сам роман не имеет ничего общего с киберпанком. «Криптономикон» можно больше отнести к историческим произведениям. В романе нет никакой фантастики, которая свойственна киберпанку. Поэтому определённо найдутся люди, которым произведение не понравится.</p>
<p>От себя могу сказать ещё то, что лично мне книга очень понравилась и теперь стоит на почётном месте на книжной полке. В дальнейшем планирую прочитать другие творения Нила Стивенсона, которые, по словам критиков, ничуть не отстают от «Криптономикона» <img src='wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>/?feed=rss2&amp;p=103</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Стиль кода в Python: Part 2</title>
		<link>/?p=93</link>
		<comments>/?p=93#comments</comments>
		<pubDate>Sat, 05 Dec 2009 15:56:49 +0000</pubDate>
		<dc:creator>Istergul</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[правила кодирования]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">/?p=93</guid>
		<description><![CDATA[Комментарии
Комментарии, которые противоречат коду, хуже, чем отсутствие комментариев. Всегда  исправляйте комментарии, если меняете код!
Комментарии должны являться законченными предложениями. Если комментарий — фраза или  предложение, первое слово должно быть написано с большой буквы, если только это не имя  переменной, которая начинается с маленькой буквы (кстати, никогда не отступайте от этого  правила для [...]]]></description>
			<content:encoded><![CDATA[<h2>Комментарии</h2>
<p>Комментарии, которые противоречат коду, хуже, чем отсутствие комментариев. Всегда  исправляйте комментарии, если меняете код!</p>
<p>Комментарии должны являться законченными предложениями. Если комментарий — фраза или  предложение, первое слово должно быть написано с большой буквы, если только это не имя  переменной, которая начинается с маленькой буквы (кстати, никогда не отступайте от этого  правила для имен переменных).</p>
<p>Если комментарий короткий, можно опустить точку в конце предложения. Блок комментариев  обычно состоит из одного или более абзацев, составленных из полноценных предложений, поэтому  каждое предложение должно оканчиваться точкой.<span id="more-93"></span></p>
<p>Ставьте два пробела после точки в конце предложения.</p>
<p>Если вы пишете по-английски, не забывайте о Странке и Уайте (имеется в виду книга Strunk &#038;  White, “Elements of style”, которая является практически эталонным руководством по правильному  написанию текстов на английском языке, — прим. перев.)</p>
<p>Программисты, которые не говорят на английском языке, пожалуйста, пишите комментарии на  английском, если только вы не уверены на 120 процентов, что ваш код никогда не будут читать  люди, не знающие вашего родного языка. </p>
<h3>Блок комментариев</h3>
<p>Блок комментариев обычно объясняет код (весь, или только некоторую часть), идущий после блока,  и должен иметь тот же отступ, что и сам код. Каждая строчка такого блока должна начинаться с  символа # и одного пробела после него (если только сам текст комментария не имеет отступа).</p>
<p>Абзацы внутри блока комментариев лучше отделять строкой, состоящей из одного символа #.</p>
<h3>Комментарии в строке с кодом</h3>
<p>Старайтесь реже использовать подобные комментарии.</p>
<p>Такой комментарий находится в той же строке, что и инструкция. «Встрочные» комментарии  должны отделяться хотя бы двумя пробелами от инструкции. Они должны начинаться с символа # и  одного пробела.</p>
<p>Комментарии в строке с кодом не нужны и только отвлекают от чтения, если они объясняют  очевидное. Не пишите вот так:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>x = x + <font color="#008000">1</font>                 <font color="#696969">#&nbsp;Increment&nbsp;x&nbsp;</font></li>
</ol>
<p></font></code></p></blockquote>
<p>Впрочем, иногда такие комметарии полезны:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>x = x + <font color="#008000">1</font>                  <font color="#696969">#&nbsp;Compensate&nbsp;for&nbsp;border&nbsp;</font></li>
</ol>
<p></font></code></p></blockquote>
<h2>Строки документации</h2>
<p>Соглашения о написании хорошей документации (docstrings) увековечены (да, забавно, но автор  использует именно такое слово, — прим. перев.) в PEP 257<sup>1</sup>.</p>
<p>Пишите документацию для всех модулей, функций, классов, методов, которые объявлены  как public. Строки документации необязательны для не-public методов, но лучше написать, что  делает метод. Комментарий нужно писать после строки с def.</p>
<p>PEP 257 объясняет, как правильно и хорошо документировать. Заметьте, очень важно, чтобы  закрывающие &#8220;&#8221;" стояли на отдельной строчке. А еще лучше, если перед ними будет ещё и пустая  строка, например:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#696969">"""Return&nbsp;a&nbsp;foobang&nbsp;&nbsp;</font><br/><font color="#696969">Optional&nbsp;plotz&nbsp;says&nbsp;to&nbsp;frobnicate&nbsp;the&nbsp;bizbaz&nbsp;first.&nbsp;</font><br/><font color="#696969">"""</font>  </li>
</ol>
<p></font></code></p></blockquote>
<p>Для однострочной документации можно оставить &#8220;&#8221;"  на той же строке.</p>
<h2>Учёт версий</h2>
<p>Если вам нужно использовать Subversion, CVS или RCS в ваших исходных кодах, делайте вот так:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>version__ = <font color="#008000">"$Revision:&nbsp;68852&nbsp;$"</font>  </li>
<li><font color="#696969">#&nbsp;$Source$&nbsp;</font></li>
</ol>
<p></font></code></p></blockquote>
<p>Вставляйте эти строки после документации модуля перед любым другим кодом и отделяйте их  пустыми строками по одной до и после.</p>
<h2>Имена</h2>
<p>Соглашения об именах переменных в python немного туманны, поэтому их список никогда не будет  полным — тем не менее, ниже мы приводим список рекоммендаций, действующих на данный  момент. Новые модули и пакеты должны быть написаны согласно этим стандартам, но если в какой- либо уже существующей библиотеке эти правила нарушаются, предпочтительнее писать в едином с  ней стиле.</p>
<h3>Описание: Стили имен </h3>
<p>Существует много разных стилей. Поможем вам распознать, какой стиль именования используется,  независимо от того, для чего он используется.</p>
<p>Обычно различают следующие стили:<br />
• b (одиночная маленькая буква)<br />
• B (одиночная заглавная буква)<br />
• lowercase (слово в нижнем регистре)<br />
• lower_case_with_underscores (слова из маленьких букв с подчеркиваниями)<br />
• UPPERCASE (заглавные буквы)<br />
• UPPERCASE_WITH_UNDERSCORES (слова из заглавных букв с подчеркиваниями)<br />
• CapitalizedWords (слова с заглавными буквами, или CapWords, или CamelCase. Иногда  называется StudlyCaps). Замечание: когда вы используете аббревиатуры в таком стиле, пишите  все буквы аббревиатуры заглавными — HTTPServerError лучше, чем HttpServerError.<br />
• mixedCase (отличается от CapitalizedWords тем, что первое слово начинается с  маленькой буквы)<br />
• Capitalized_Words_With_Underscores (слова с заглавными буквами и  подчеркиваниями — уродливо!)<br />
•  Ещё существует стиль, в котором имена, принадлежащие одной логической группе, имеют один  короткий префикс. Этот стиль редко используется в python, но мы упоминаем его для полноты.  Например, функция os.stat() возвращает кортеж, имена в котором традиционно имеют вид  st_mode, st_size, st_mtime и так далее. (Так сделано, чтобы подчеркнуть соответствие этих  полей структуре системных вызовов POSIX, что помогает знакомым с ней программистам).</p>
<p>В библиотеке X11 используется префикс Х для всех public-функций. В python этот стиль считается  излишним, потому что перед полями и именами методов стоит имя объекта, а перед именами  функций стоит имя модуля.</p>
<p>В дополнение к этому, используются следующие специальные формы записи имен с добавлением  символа подчеркивания в начало или конец имени:<br />
• _single_leading_underscore: слабый индикатор того, что имя используется для «внутренних  нужд». Например,  from M import *  не будет импортировать объекты, чьи имена начинаются с  символа подчеркивания.<br />
• single_trailing_underscore_: используется по соглашению для избежания конфликтов с  ключевыми словами языка python, например:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><b>Tkinter</b>.Toplevel(master, class_=<font color="#008000">'ClassName'</font>) </li>
</ol>
<p></font></code></p></blockquote>
<p>• __double_leading_underscore: изменяет имя атрибута класса, т.е. в class FooBar поле  __boo становится _FooBar__boo.<br />
• __double_leading_and_trailing_underscore__ (двойное подчеркивание в начале и в конце  имени): «волшебные» объекты или атрибуты, которые «живут» в пространствах имен,  управляемых пользователем (user-controlled namespaces). Например, __init__, __import__  или  __file__. Не изобретайте такие имена, используйте их только так, как написано в документации.</p>
<h3>Стили имен<br />
<h3>
<h3>Имена, которых следует избегать</h3>
<p>Никогда не используйте символы l (малелькая латинская буква «эль»), O (заглавная латинская  буква «о») или I (заглавная латинская буква «ай») как однобуквенные идентификаторы.</p>
<p>В некоторых шрифтах эти символы неотличимы от цифры один и нуля (и символа<br />
вертикальной  палочки, — прим. перев.) Если очень нужно использовать l имена, пишите<br />
вместо неё заглавную L.</p>
<h3>Имена модулей и пакетов</h3>
<p>Модули должны иметь короткие имена, состоящие из маленьких букв. Можно использовать и  символы подчеркивания, если это улучшает читабельность. То же, за исключением символов  подчеркивания, относится и к именам пакетов.</p>
<p>Так как имена модулей отображаются в имена файлов, а некоторые файловые системы являются  нечувствительными к регистру символов и обрезают длинные имена, очень важно<br />
использовать  достаточно короткие имена модулей — это не проблема в Unix, но, возможно, код окажется  непереносимым в старые версии Windows или Mac, или DOS.</p>
<p>Когда модуль расширения, написанный на С или C++, имеет сопутствующий python-модуль  (содержащий интерфейс высокого уровня), С/С++ модуль начинается с символа подчеркивания,  например, _socket.</p>
<h3>Имена классов</h3>
<p>Все имена классов должны следовать соглашению CapWords почти без исключений. Классы  внутреннего использования могут начинаться с символа подчеркивания.</p>
<h3>Имена исключений (exceptions)</h3>
<p>Так как исключения являются классами, к исключениями применяется стиль именования классов.  Однако вы можете добавить Error в конце имени (если конечно исключение действительно  является ошибкой). </p>
<h3>Имена глобальных переменных</h3>
<p>Будем надеяться, что такие имена используются только внутри одного модуля. Руководствуйтесь  теми же соглашениями, что и для имен функций.</p>
<p>Добавляйте в модули, которые написаны так, чтобы их использовали с помощью from M import *,  механизм __all__ чтобы предотвратить экспортирование глобальных переменных. Или же,  используйте старое соглашение, добавляя перед именами таких глобальных переменных один  символ подчеркивания (которым вы можете обозначить те глобальные переменные, которые  используются только внутри модуля).</p>
<h3>Имена функций</h3>
<p>Имена функций должны состоять из маленьких букв, а слова разделяться символами  подчеркивания — это необходимо, чтобы увеличить читабельность. Стиль mixedCase допускается в тех местах, где уже преобладает такой стиль, например во  threading.py, для сохранения обратной совместимости.</p>
<h3>Аргументы функций и методов</h3>
<p>Всегда используйте self в качестве первого аргумента метода экземпляра объекта  (instance method).</p>
<p>Всегда используйте cls в качестве первого аргумента метода класса (class method).</p>
<p>Если имя аргумента конфликтует с зарезервированным ключевым словом python, обычно<br />
лучше  добавить в конец имени символ подчеркивания, чем исказить написание слова или использовать  аббревиатуру. Таким образом, print_ лучше, чем prnt. (Возможно, хорошим вариантом будет  подобрать синоним).</p>
<h3>Имена методов и переменные экземпляров классов </h3>
<p>Используйте тот же стиль, что и для имен функций: имена должны состоять из  маленьких букв,  а слова разделяться символами подчеркивания.</p>
<p>Чтобы избежать конфликта имен с подклассами, добавьте два символа подчеркивания, чтобы  включить механизм изменения имен. Если класс Foo имя атрибут с именем __foo, к нему нельзя  обратиться, написав Foo.__a. (Настойчивый пользователь всё равно может получить доступ,  написав Foo._Foo__a). Вообще, двойное подчеркивание в именах должно использоваться, чтобы  избежать конфликта имен с атрибутами классов, спроектированных так, чтобы от них наследовали  подклассы.</p>
<h3>Константы</h3>
<p>Константы обычно объявляются на уровне модуля и записываются только заглавными буквами, а  слова разделяются символами подчеркивания. Например: MAX_OVERFLOW, TOTAL.</p>
<h3>Проектирование наследования</h3>
<p>Обязательно решите, каким должен быть метод класса или переменная экземпляра класса (в   общем, атрибут) — public или не-public. Если вы сомневаетесь, выберите закрытый, не-public  атрибут. Потом будет проще сделать их public, чем наоборот.</p>
<p>Открытые атрибуты — это те, которые будут использовать потребители ваших классов, и вы  должны быть уверены в отсутствии обратной несовместимости. Не-public атрибуты, в свою очередь,  не предназначены для использования третьими лицами, поэтому вы можете не гарантировать, что  не измените или не удалите эти атрибуты.</p>
<p>Мы не используем термин «закрытый член» (private), потому что на самом деле в python таких  членов не бывает.</p>
<p>Другой тип аттрибутов классов принадлежит так называемому API подклассов (в других языках они  часто называются protected). Некоторые классы проектируются так, чтобы от них наследовали  другие классы, которые расширяют или модифицируют поведение базового класса. Когда вы  проектируете такой класс, решите и явно укажите, какие атрибуты являются открытыми (public),  какие принадлежат API подклассов (subclass API), а какие используются только базовым классом.</p>
<p>Теперь сформулируем рекомендации: </p>
<p>• Открытые атрибуты не должны иметь в начале имени символа подчеркивания </p>
<p>• Если имя открытого атрибута конфликтует с ключевым словом языка, добавьте в конец имени  один символ подчеркивания. Это более предпочтительно, чем аббревиатура или искажение  написания (однако, у этого правила есть исключение — аргумента который означает класс, и  особенно первый аргумент метода класса (class method) должен иметь имя cls).</p>
<p>• Назовите простые открытые атрибуты понятными именами и не пишите сложные методы доступа  и изменения (accessor/mutator, get/set, — прим. перев.) Помните, что в python очень легко добавить  их потом, если потребуется. В этом случае используйте свойства (properties), чтобы скрыть  функциональную реализацию за синтаксисом доступа к атрибутам.<br />
• Свойства (properties) работают только в классах нового стиля (new-style classes)<br />
• Постарайтесь избавиться от побочных эффектов, связанным с функциональным поведением;  впрочем, такие вещи, как кэширование, вполне допустимы.<br />
• Избегайте использования вычислительно затратных операций, потому что из-за записи с  помощью атрибутов создается впечатление, что доступ происходит (относительно) быстро.</p>
<p>• Если вы планируете класс таким образом, чтобы от него наследовались другие классы, но не  хотите, чтобы подклассы унаследовали некоторые атрибуты, добавьте в имена два символа  подчеркивания в начало, и ни одного — в конец. Механизм изменения имен в python (name  mangling, — прим. перев.) сработает так, что имя класса добавится к имени такого атрибута, что  позволит избежать конфликта имен с атрибутами подклассов.<br />
• Будьте внимательны: если подкласс будет иметь то же имя класса и имя атрибута, то вновь  возникнет конфликт имен.<br />
• Механизм изменения имен может затруднить отладку или работу с __getattr__(), однако он  хорошо документирован и легко реализуется вручную.<br />
• Не всем нравится этот механизм, поэтому старайтесь достичь компромисса между  необходимостью избежать конфликта имен и возможностью доступа к этим атрибутам.</p>
<h2>Общие рекомендации</h2>
<p>Код должен быть написан так, чтобы не зависеть от разных реализация языка (PyPy, Jython,  IronPython, Pyrex, Psyco и пр.). Например, не полагайтесь на эффективную реализацию в CPython  конкатенации строк в выражениях типа a+=b или a=a+b. Такие инструкции выполняются  значительно медленнее в Jython. В критичных к времени выполнения частях программы  используйте &#8221;.join() — таким образом склеивание строк будет выполнено за линейное время  независимо от реализации python.</p>
<p>Сравнения с None должны обязательно выполняться с использованием операторов is или is not,  а не с помощью операторов равенства или неравенства.</p>
<p>Кроме того, не пишите if x, если имеете в  виду if x is not None — если, к примеру, при тестировании такая переменная или аргумент примет  значение иного типа, то при приведении к булевскому типу получится false.</p>
<p>Создавайте исключения на основе классов. Впрочем, начиная с версии python 2.6, мы уже не можем  использовать строки в качестве исключений. В модулях или пакетах создавайте свои базовые  классы исключений, наследуя их от встроенного класса Exception и обязательно их  документируйте: </p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">class</font> <font color="#cc6633">MessageError</font>(Exception):</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#696969">"""Base&nbsp;class&nbsp;for&nbsp;errors&nbsp;in&nbsp;the&nbsp;email&nbsp;package."""</font>  </li>
</ol>
<p></font></code></p></blockquote>
<p>Здесь применимы  те же правила, что и для именования классов. Если исключение по своему  смыслу является ошибкой, вы можете добавить в конце имени Error.</p>
<p>Когда вы генерируете исключение, пишите raise ValueError(&#8217;message&#8217;) вместо старого синтаксиса  raise ValueError, message. Такое использование предпочтительнее, потому что из-за скобок не  нужно использовать символы для продолжения перенесенных строк, если эти строки длинные или  если используется форматирование. Старая форма записи запрещена в python 3000.</p>
<p>Когда код перехватывает исключения, «ловите» конкретные ошибки вместо простого выражнения  except:. К примеру, пишите вот так:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">try</font>:</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">import</font> platform_specific_module</li>
<li><font color="#0000ff">except</font> ImportError:</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;platform_specific_module = None </li>
</ol>
<p></font></code></p></blockquote>
<p>Простое написание &#8216;except:&#8217; также перехватит и SystemExit, и KeyboardInterrupt, что  породит проблемы, например, сложнее будет завершить программу нажатием control+C. Если вы  действительно собираетесь перехватить все исключения, пишите  &#8216;except Exception:&#8217;. </p>
<p>Ограничьтесь использованием чистого &#8216;except:&#8217; в двух случаях:</p>
<p>1. Если обработчик исключения выводит пользователю всё о случившейся ошибке (например,  traceback)</p>
<p>2. Если нужно выполнить некоторый код после перехвата исключения, а потом вновь «бросить» его  для обработки где-то в другом месте. Обычно же лучше пользоваться конструкцией  &#8216;try&#8230;finally&#8217;.</p>
<p>Постарайтесь заключать в каждую конструкцию try&#8230;except минимум кода, чтобы легче отлавливать  ошибки.</p>
<p>можно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">try</font>:  </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;value = collection[key]  </li>
<li><font color="#0000ff">except</font> KeyError:  </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font> key_not_found(key)  </li>
<li><font color="#0000ff">else</font>:  </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font> handle_value(value)  </li>
</ol>
<p></font></code></p></blockquote>
<p>нельзя:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">try</font>:  </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font> handle_value(collection[key])  </li>
<li><font color="#0000ff">except</font> KeyError:  </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font> key_not_found(key) </li>
</ol>
<p></font></code></p></blockquote>
<p>Используйте строковые методы вместо модуля string — они всегда быстрее и имеют тот же API  для unicode-строк. Можно отказаться от этого правила, если необходима совместимость с версиями  python младше 2.0.</p>
<p>Пользуйтесь &#8221;.startswith() и &#8221;.endswith() вместо обработки частей строк (string slicing) для  проверки суффиксов или префиксов. startswith() и endswith() выглядят чище и порождают  меньше ошибок. Например:</p>
<p>можно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> foo.startswith(<font color="#008000">'bar'</font>):  </li>
</ol>
<p></font></code></p></blockquote>
<p>нельзя:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> foo[:<font color="#008000">3</font>] == <font color="#008000">'bar'</font>:  </li>
</ol>
<p></font></code></p></blockquote>
<p>Исключением является случай, когда вам нужна совместимость с python 1.5.2.</p>
<p>Сравнение типов объектов нужно делать с помощью isinstance(), а не прямым сравнением  типов:</p>
<p>можно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> <b>isinstance</b>(obj, int): </li>
</ol>
<p></font></code></p></blockquote>
<p>нельзя:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> <b>type</b>(obj) <font color="#0000ff">is</font> <b>type</b>(<font color="#008000">1</font>): </li>
</ol>
<p></font></code></p></blockquote>
<p>Когда вы проверяете, является ли объект строкой, обратите внимание на то, что строка может быть  unicode-строкой. В python 2.3 у str и unicode есть общий базовый класс, поэтому пишите вот так:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> <b>isinstance</b>(obj, basestring): </li>
</ol>
<p></font></code></p></blockquote>
<p>В python 2.2 в модуле types для этой цели определен тип StringTypes:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">from</font> types <font color="#0000ff">import</font> StringTypes</li>
<li><font color="#0000ff">if</font> <b>isinstance</b>(obj, StringTypes): </li>
</ol>
<p></font></code></p></blockquote>
<p>В python 2.0 и 2.1 нужно писать:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">from</font> types <font color="#0000ff">import</font> StringType, UnicodeType </li>
<li><font color="#0000ff">if</font> <b>isinstance</b>(obj, StringType) <font color="#0000ff">or</font> \ </li>
<li><b>isinstance</b>(obj, UnicodeType) : </li>
</ol>
<p></font></code></p></blockquote>
<p>Для последовательностей (строк, списков, кортежей) можно использовать тот факт, что пустая  последовательность есть false:</p>
<p>правильно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if not</font> seq: </li>
<li><font color="#0000ff">if</font> seq: </li>
</ol>
<p></font></code></p></blockquote>
<p>неправильно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> <b>len</b>(seq): </li>
<li><font color="#0000ff">if not</font> <b>len</b>(seq): </li>
</ol>
<p></font></code></p></blockquote>
<p>Не пользуйтесь строковыми константами, которые имеют важные пробелы в конце — они  невидимы, а многие редакторы (а теперь и reindent.py) обрезают их.</p>
<p>Не сравнивайте логические типы с True и False с помощью ==:</p>
<p>правильно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> greeting: </li>
</ol>
<p></font></code></p></blockquote>
<p>неправильно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> greeting == True: </li>
</ol>
<p></font></code></p></blockquote>
<p>А вот так писать совсем плохо:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> greeting <font color="#0000ff">is</font> True: </li>
</ol>
<p></font></code></p></blockquote>
<h2>Copyright</h2>
<p>Авторы: Guido van Rossum <guido at python.org>, Barry Warsaw <barry at python.org>.</p>
<p>Текст собран Андреем Черниным из версии 68852 PEP 8 — «Style Guide for Python Code».</p>
<p>Перевод на русский язык выполнен Дмитрием Бударагиным.</p>
<hr />
<p><sup>1</sup> PEP 257, Docstring Conventions, Goodger, van Rossum</p>
<hr />
<p>Материалы опубликованы с согласием <a href="index.html">переводчика</a>.<br />
<a href="index.html">Топик на Хабре</a></p>
]]></content:encoded>
			<wfw:commentRss>/?feed=rss2&amp;p=93</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Стиль кода в Python: Part 1</title>
		<link>/?p=85</link>
		<comments>/?p=85#comments</comments>
		<pubDate>Fri, 04 Dec 2009 19:37:14 +0000</pubDate>
		<dc:creator>Istergul</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[правила кодирования]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">/?p=85</guid>
		<description><![CDATA[Введение
Этот документ описывает соглашение о том, как писать код для языка python, включая  стандартную библиотеку, входящую в состав python. Пожалуйста, посмотрите также на  сопутствующий PEP (python enhanced proposal — заявки на улучшение языка python), описывающий,  какого стиля следует придерживаться при  написании кода на C в реализации языка python1. 
Этот документ создан [...]]]></description>
			<content:encoded><![CDATA[<h2>Введение</h2>
<p>Этот документ описывает соглашение о том, как писать код для языка python, включая  стандартную библиотеку, входящую в состав python. Пожалуйста, посмотрите также на  сопутствующий PEP (python enhanced proposal — заявки на улучшение языка python), описывающий,  какого стиля следует придерживаться при  написании кода на C в реализации языка python<sup>1</sup>. </p>
<p>Этот документ создан на основе рекомендаций Гуидо ван Россума с добавлениями от Барри. Если  где-то возникал конфликт, мы выбирали стиль Гуидо. И, конечно, этот PEP может быть неполным  (фактически, он, наверное, никогда не будет закончен).<span id="more-85"></span></p>
<h2>A Foolish Consistency is the  Hobgoblin of Little Minds<sup>2</sup></h2>
<p>Ключевая идея Гуидо такова: код читается намного больше раз, чем пишется. Собственно,  рекоммендации о стиле написания кода направлены на то, чтобы улучшить читбельность кода и  сделать его согласованным между большим числом проектов. В идеале, весь код будет написан в  едином стиле, и любой сможет легко его прочесть. Как говорится в PEP 20<sup>3</sup>, «Читабельность имеет  значение».</p>
<p>Это руководство о согласованности и единстве. Согласованность с этим руководством очень важна.  Согласованность внутри одного проекта еще важнее. А согласованность внутри модуля или  функции — самое важное. Но важно помнить, что иногда это руководство неприменимо, и понимать,  когда можно отойти от рекоммендаций. Когда вы сомневаетесь, просто посмотрите на другие  примеры и решите, какой выглядит лучше.</p>
<p>Две причины, чтобы нарушить правила:<br />
• Когда применение правила сделает код менее читабельным даже для того, кто привык читать  код, который следует правилам.<br />
• Чтобы писать в едином стиле с кодом, который уже есть в проекте и который нарушает правила  (может быть, в силу исторических причин) — впрочем, это возможность подчистить чужой код.</p>
<h2>Внешний вид кода</h2>
<h3>Отступы</h3>
<p>Используйте 4 пробела на один уровень отступа. В старом коде, который вы не хотите трогать,  можно продолжить пользоваться 8 пробелами для отступа.</p>
<h3>Табуляция или пробелы?</h3>
<p>Никогда не смешивайте символы табуляции и пробелы.</p>
<p>Самый распространенный способ отступов — пробелы. На втором месте — отступы только с  использованием табуляции. Код, в котором используются и те, и другие типы отступов, должен быть   исправлен так, чтобы отступы в нем были расставлены только с помощью пробелов. Когда вы  вызываете интерпретатор в командной строке с параметром -t, он выдает предупреждения  (warnings) при использовании смешанного стиля в отступах, а запустив интерпретатор с  параметром -tt, вы получите в этих местах ошибки (errors). Используйте этии опции!</p>
<p>В новых проектах для отступов мы настоятельно рекомендуем использовать пробелы. К тому же,  многие редакторы позволяют легко делать.</p>
<h3>Максимальная длина строки</h3>
<p>Ограничьте максимальную длину строки 79 символами.</p>
<p>Пока еще существует немало устройств, где длина строки равна 80 символам; к тому же, ограничив  ширину окна 80 символами, мы сможем расположить несколько окон рядом друг с другом.  Автоматический перенос строк на таких устройствах нарушит форматирование, и код будет  труднее понять. Так что, пожалуйста, ограничьте длину строки 79 символами, и 72 символами в  случае длинных блоков текста (строки документации или комментарии).</p>
<p>Предпочтительный способ переноса длинных строк — использование подразумевающегося  продолжения строки между обычными, квадратными и фигурными скобками. В случае  необходимости можно добавить еще одну пару скобок вокруг выражения, но часто лучше выглядит  обратный слэш. Постарайтесь сделать правильные отступы для перенесённой строки.  Предпочтительнее вставить перенос строки после бинарного оператора, но не перед ним.</p>
<p>Вот несколько примеров:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">class</font> <font color="#cc6633">Rectangle</font>(Blob):</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">def __init__</font>(self, width, height,</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color=<font color="#008000">'black'</font>, emphasis=None, highlight=<font color="#008000">&nbsp;0</font>):</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> width == <font color="#008000">&nbsp;0</font> <font color="#0000ff">and</font> height == <font color="#008000">&nbsp;0</font> <font color="#0000ff">and</font> \</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color == <font color="#008000">'red'</font> <font color="#0000ff">and</font> emphasis == <font color="#008000">'strong'</font> <font color="#0000ff">or</font> \</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;highlight &gt; <font color="#008000">100</font>:</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">raise</font> <b>ValueError</b>(<font color="#008000">"sorry,&nbsp;you&nbsp;lose"</font>)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> width == <font color="#008000">&nbsp;0</font> <font color="#0000ff">and</font> height == <font color="#008000">&nbsp;0</font> <font color="#0000ff">and</font> (color == <font color="#008000">'red'</font> <font color="#0000ff">or</font></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emphasis <font color="#0000ff">is</font> None):</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">raise</font> <b>ValueError</b>(<font color="#008000">"I&nbsp;don't&nbsp;think&nbsp;so&nbsp;--&nbsp;values&nbsp;are&nbsp;%s,&nbsp;%s"</font> %</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(width, height))</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Blob.<font color="#0000ff">__init__</font>(self, width, height,</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color, emphasis, highlight)  </li>
</ol>
<p></font></code></p></blockquote>
<h3>Пустые строки</h3>
<p>Отделяйте функции (верхнего уровня, не функции внутри функций) и определения классов двумя  пустыми строчками.</p>
<p>Определения методов внутри класса отделяйте одной пустой строкой.</p>
<p>Дополнительные отступы строками могут быть изредка использованы для выделения группы  логически связанных функций. Пустые строки могут быть пропущены, между несколькими  выражениями, записанными в одну строку, например, «заглушки» функций.</p>
<p>Используйте (без энтузиазма) пустые строки в коде функций, чтобы отделить друг от друга  логические части.</p>
<p>Python расценивает символ control+L как незначащий (whitespace), и вы можете использовать его,  потому что многие редакторы обрабатывают его как разрыв страницы — таким образом логические  части в файле будут на разных страницах.  </p>
<h3>Кодировки (PEP 263)</h3>
<p>Код ядра python всегда должен использовать ASCII или Latin-1 кодировку (также известную как  ISO-8859-1). Начиная с версии python 3.0, предпочтительной является кодировка UTF-8 (смотрите  PEP 3120).</p>
<p>Files using ASCII (or UTF-8, for Python 3.0) should not have a coding cookie.  Используйте Latin-1 (или  UTF-8), только если это необходимо, чтобы указать в комментарии или строке документации имя  автора, содержащее в себе символ из Latin-1. В противном случае предпочтительнее использовать  escape-символы \x, \u или \U для не-ASCII символов в строках.</p>
<p>Начиная с версии python 3.0 в стандартной библиотеке действует следующая политика (смотрите  PEP 3131): все идентификаторы обязаны содержать только ASCII символы, и означать английские  слова везде, где это возможно (во многих случаях используются сокращения или неанглийские технические термины). Кроме того, строки и комментарии тоже должны содержать лишь ASCII  символы. Исключения составляют: (а) test case, тестирующий не-ASCII особенности программы, и (б)   имена авторов. Авторы, буквы в именах которых не из латинского алфавита, должны  транслитерировать свои имена в латиницу.</p>
<p>Проектам с открытым кодом для широкой аудитории также рекомендуется использовать это  соглашение.</p>
<h2>Import-секции </h2>
<p>Импортирование разных модулей должно быть на разных строчках, например:<br />
правильно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">import</font> os</li>
<li><font color="#0000ff">import</font> sys </li>
</ol>
<p></font></code></p></blockquote>
<p>неправильно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">import</font> os, sys </li>
</ol>
<p></font></code></p></blockquote>
</p>
<p>В то же время, можно писать вот так:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">from</font> subprocess <font color="#0000ff">import</font> Popen, PIPE </li>
</ol>
<p></font></code></p></blockquote>
<p>Импортирование всегда нужно делать сразу после комментариев к модулю и строк документации,  перед объявлением глобальных переменных и констант.</p>
<p>Группируйте импорты в следующем порядке:<br />
• импорты стандартной библиотеки<br />
• импорты сторонних библиотек<br />
• импорты модулей текущего проекта </p>
<p>Вставляйте пустую строку между каждой группой импортов.</p>
<p>Указывайте спецификации __all__ после импортов.</p>
<p>Относительные импорты крайне не рекомендуются — всегда указывайте абсолютный путь к  модулю для всех импортирований. Даже сейчас, когда PEP 328<sup>4</sup> реализован в версии python 2.5,  использовать явные относительные импорты нежелательно, потому что абсолютные импорты лучше  переносимы и читабельны.</p>
<p>Когда вы импортируете класс из модуля, вполне можно писать вот так:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">from</font> myclass <font color="#0000ff">import</font> MyClass <font color="#0000ff">from</font> foo.bar.yourclass <font color="#0000ff">import</font> YourClass </li>
</ol>
<p></font></code></p></blockquote>
<p>Если такое написание вызывает конфликт имен, тогда пишите:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">import</font> myclass <font color="#0000ff">import</font> foo.bar.yourclass </li>
</ol>
<p></font></code></p></blockquote>
<p>И используйте «myclass.MyClass» и «foo.bar.yourclass.Yourclass».</p>
<h3>Пробелы в выражениях и  инструкциях</h3>
<p>Избегайте использования пробелов в следующих ситуациях: </p>
<p>1. Сразу после или перед скобками (обычными, фигурными и квадратными)<br />
можно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>spam(ham[<font color="#008000">1</font>], {eggs: <font color="#008000">2</font>}) </li>
</ol>
<p></font></code></p></blockquote>
<p>нельзя:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>spam( ham[ <font color="#008000">1</font> ], { eggs: <font color="#008000">2</font> } ) </li>
</ol>
<p></font></code></p></blockquote>
<p>2. Сразу перед запятой, точкой с запятой, двоеточием:<br />
можно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> x == <font color="#008000">4</font>: <font color="#0000ff">print</font> x, y; x, y = y, x </li>
</ol>
<p></font></code></p></blockquote>
<p>нельзя</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> x == <font color="#008000">4</font> : <font color="#0000ff">print</font> x , y ; x , y = y , x </li>
</ol>
<p></font></code></p></blockquote>
<p>3. Сразу перед открывающей скобкой, после которой начинается список аргументов при вызове  функции:<br />
можно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>spam(<font color="#008000">1</font>) </li>
</ol>
<p></font></code></p></blockquote>
<p>нельзя:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>spam (<font color="#008000">1</font>) </li>
</ol>
<p></font></code></p></blockquote>
<p>4. Сразу перед открывающей скобкой, после которой следует индекс или срез:<br />
можно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>dict[<font color="#008000">'key'</font>] = list[index] </li>
</ol>
<p></font></code></p></blockquote>
<p>нельзя:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>dict [<font color="#008000">'key'</font>] = list [index] </li>
</ol>
<p></font></code></p></blockquote>
<p>5. Использование более одного пробела вокруг оператора присваивания (или любого другого) для  того, чтобы выровнять его с другим таким же оператором на соседней строке:<br />
можно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>x = <font color="#008000">1</font>  </li>
<li>y = <font color="#008000">2</font>  </li>
<li>long_variable = <font color="#008000">3</font>  </li>
</ol>
<p></font></code></p></blockquote>
<p>нельзя:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>x             = <font color="#008000">1</font>  </li>
<li>y             = <font color="#008000">2</font>  </li>
<li>long_variable = <font color="#008000">3</font> </li>
</ol>
<p></font></code></p></blockquote>
<p>Прочие рекомендации:</p>
<p>1. Вседа окружайте эти бинарные операторы одним пробелом с каждой стороны: присваивание (=,  +=, -= и прочие), сравнения (==, <, >, !=, <>, <=, >=, in, not in, is, is not), логические  операторы (and, or, not). </p>
<p>2. Ставьте пробелы вокруг арифметических операций.<br />
можно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>i = i + <font color="#008000">1</font>  </li>
<li>submitted += <font color="#008000">1</font>  </li>
<li>x = x * <font color="#008000">2</font> - <font color="#008000">1</font>  </li>
<li>hypot2 = x * x + y * y  </li>
<li>c = (a + b) * (a - b)  </li>
</ol>
<p></font></code></p></blockquote>
<p>нельзя:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>i=i+<font color="#008000">1</font>  </li>
<li>submitted +=<font color="#008000">1</font>  </li>
<li>x = x*<font color="#008000">2</font> - <font color="#008000">1</font>  </li>
<li>hypot2 = x*x + y*y  </li>
<li>c = (a+b) * (a-b) </li>
</ol>
<p></font></code></p></blockquote>
<p>3. Не используйте пробелы для отделения знака =, когда он употребляется для обозначения  аргумента-ключа (keyword argument) или значения параметра по умолчанию.<br />
можно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">def</font> <font color="#cc6633">complex</font>(real, imag=<font color="#008000">&nbsp;0</font>.<font color="#008000">&nbsp;0</font>):</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font> magic(r=real, i=imag)  </li>
</ol>
<p></font></code></p></blockquote>
<p>нельзя:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">def</font> <font color="#cc6633">complex</font>(real, imag = <font color="#008000">&nbsp;0</font>.<font color="#008000">&nbsp;0</font>):  </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font> magic(r = real, i = imag)  </li>
</ol>
<p></font></code></p></blockquote>
<p>4. Не используйте составные инструкции (несколько команд в одной строке).<br />
можно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> foo == <font color="#008000">'blah'</font>:  </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;do_blah_thing()  </li>
<li>do_one()  </li>
<li>do_two()  </li>
<li>do_three()  </li>
</ol>
<p></font></code></p></blockquote>
<p>нельзя:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> foo == <font color="#008000">'blah'</font>: do_blah_thing()  </li>
<li>do_one(); do_two(); do_three() </li>
</ol>
<p></font></code></p></blockquote>
<p>5. Иногда можно писать тело циклов while, for или ветку if в той же строке, если команда короткая,  но если команд несколько, никогда так не пишите.<br />
можно:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> foo == <font color="#008000">'blah'</font>: do_blah_thing()</li>
<li><font color="#0000ff">for</font> x <font color="#0000ff">in</font> lst: total += x  </li>
<li><font color="#0000ff">while</font> t &lt; <font color="#008000">10</font>: t = delay()  </li>
</ol>
<p></font></code></p></blockquote>
<p>нельзя:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> foo == <font color="#008000">'blah'</font>: do_blah_thing()  </li>
<li><font color="#0000ff">else</font>: do_non_blah_thing()</li>
<li><font color="#0000ff">try</font>: something()  </li>
<li><font color="#0000ff">finally</font>: cleanup()  </li>
<li>do_one(); do_two(); do_three(long, argument,  </li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list, like, this)  </li>
<li><font color="#0000ff">if</font> foo == <font color="#008000">'blah'</font>: one(); two(); three() </li>
</ol>
<p></font></code></p></blockquote>
<hr />
<p><sup>1</sup> PEP 7, Style Guide for C Code, van Rossum<br />
<sup>2</sup> «A foolish consistency is the hobgoblin of little minds, adored by little statesman and philosophers and  divines.  With consistency a great soul has simply nothing to do» — цитата Ральфа Валдо Эмерсона,  известного американского писателя.<br />
<sup>3</sup> PEP 20, The Zen of Python<br />
<sup>4</sup> PEP 328, Imports: Multi-Line and Absolute/Relative</p>
<hr />
<p>Материалы опубликованы с согласием <a href="index.html">переводчика</a>.<br />
<a href="index.html">Топик на Хабре</a></p>
]]></content:encoded>
			<wfw:commentRss>/?feed=rss2&amp;p=85</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Облачные вычисления от гигантов IT-рынка</title>
		<link>/?p=74</link>
		<comments>/?p=74#comments</comments>
		<pubDate>Mon, 30 Nov 2009 20:19:11 +0000</pubDate>
		<dc:creator>Istergul</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Amazon EC2]]></category>
		<category><![CDATA[Google AppEngine]]></category>
		<category><![CDATA[Microsoft Azure]]></category>
		<category><![CDATA[облачные вычисления]]></category>

		<guid isPermaLink="false">/?p=74</guid>
		<description><![CDATA[
С активным развитием веб-приложений начался буйный рост технологий облачных вычислений. Об этом я уже писал в своём предыдущем посте, где сделал краткий обзор основных видов облаков. Теперь же попробую быстро проскочить по cloud-сервисам, предоставляемым ключевыми вендорами на рынке.
Первым серьёзным и доступным cloud-хостингом явился Amazon Elastic Compute Cloud (Amazon EC2). Сейчас Amazon является одним из наиболее [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-75 alignleft" title="Cloud-Computing" src="wp-content/uploads/2009/11/Cloud-Computing.jpg" alt="Облачные вычисления" width="260" height="220" />
<p>С активным развитием веб-приложений начался буйный рост технологий облачных вычислений. Об этом я уже писал в своём предыдущем посте, где сделал краткий обзор основных видов облаков. Теперь же попробую быстро проскочить по cloud-сервисам, предоставляемым ключевыми вендорами на рынке.</p>
<p>Первым серьёзным и доступным cloud-хостингом явился <strong>Amazon Elastic Compute Cloud</strong> (<strong>Amazon EC2</strong>). Сейчас Amazon является одним из наиболее крупных игроков на рынке облачных вычислений. Множество компаний пользуется облачным сервисом именно от Amazon. Насколько мне известно, даже известный сервис для микроблоггинга Twitter решил проблему масштабирования с Amazon EC2. Услуги, связанные с облачными вычислениями, Amazon предоставляет под единым брендом Web Services. Кроме Amazon EC2 туда входят:</p>
<p><strong>Simple DB</strong> – сервис, предоставляющий ядро функций базы данных, а именно индексирование данных и выполнение запросов;</p>
<p><strong>Simple Storage Service</strong>  или <strong>Amazon S3</strong> – сервис для хранения и получения больших объёмов данных и REST-API для доступа;</p>
<p><strong>CloudFront</strong> – распределённая сеть хранения и доставки контента;</p>
<p><strong>Simple Queue Service</strong> – система очередей сообщений, в которой разработчики могут перемещать данные между своими приложениями, выполняющими разные задачи, с высокой надёжностью;</p>
<p><strong>Elastic MapReduce</strong> – сервис для обработки и проведения анализа больших объёмов данных на основе Apache Hadoop.<span id="more-74"></span></p>
<p>Отмечу, что весь этот слоёный пирог облачных сервисов далеко не бесплатен и пользователю нужно платить за все используемые ресурсы. Если брать в расчет только непосредственно Amazon EC2 с минимальными аппаратными характеристиками, то это выльется около 80$ в месяц, хотя по сравнению с некоторыми VPS это не так уж и дорого <img src='wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Наиболее известной же системой для облачных вычислений, бесспорно, является <strong>Google AppEngine</strong>, представляющую собой хостинг для веб-аппликаций, ограниченный конкретным API и системными сервисами. Приложения, разворачиваемые на базе Google AppEngine могут быть написаны на двух языках: Python и Java. На данный момент сервис ещё находится в стадии бета-тестирования, поэтому любой девелопер может бесплатно пользоваться им, но только если посещаемость не превысит 5 миллионов хитов в месяц. В рамках бесплатного аккаунта предоставляется 500 мегабайт дискового пространства. Среда исполнения использует Python 2.5.2, что не может ни огорчать, так как я всеми своими принципами выступаю за Python 3 и его скорейшее становление на ноги.</p>
<p>Очень похожий сервис для облачных вычислений представила Microsoft. Платформа носит название <strong>Azure</strong>. В её основе лежит специальная версия Windows Server 2008, остальные сервисы, которые доступны девелоперу, базируются на уже известных технологиях, таких как: .NET Runtime, SQL Service, Live, SharePoint, Dynamics CRM. Сама система предназначена для построения корпоративных приложений. Так же как и AppEngine, Microsoft Azure ещё находится в стадии тестирования.</p>
<p>Evans Data Corp не так давно проводила опрос среди разработчиков на тему, продукты каких компаний они используют или планируют использовать для использования cloud computing. На рисунке в системе координат расположены поставщики в соответствии с тем, как их воспринимают разработчики. Ось абсцисс показывает, насколько высоко разработчики оценивают способность вендора реализовать стратегию облачных вычислений. По оси ординат расположены оценки полноты решений. Круговые маркеры демонстрируют степень освоения решений вендора заказчиками, при этом внутренний красный круг показывает текущее количество внедрений, а внешняя черная окружность — количество внедрений, планируемых в ближайшие 12 мес.</p>
<p><img class="size-full wp-image-76" title="pic1" src="wp-content/uploads/2009/11/pic1.jpg" alt="облачные вычисления" width="700" height="429" /></p>
<p>Сразу бросается в глаза преимущество, имеющееся у Amazon и Google. По мнению опрошенных, они обладают самым высоким потенциалом для реализации технологии облачных вычислений.</p>
]]></content:encoded>
			<wfw:commentRss>/?feed=rss2&amp;p=74</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Про облака на пальцах</title>
		<link>/?p=62</link>
		<comments>/?p=62#comments</comments>
		<pubDate>Sat, 28 Nov 2009 19:07:16 +0000</pubDate>
		<dc:creator>Istergul</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[CaaS]]></category>
		<category><![CDATA[IaaS]]></category>
		<category><![CDATA[PaaS]]></category>
		<category><![CDATA[SaaS]]></category>
		<category><![CDATA[облачные вычисления]]></category>

		<guid isPermaLink="false">/?p=62</guid>
		<description><![CDATA[
«Облачные вычисления». Первое, что встаёт перед глазами у человека незнакомого с этим термином, так это компьютер, зависший в облаках. На самом деле облачные вычисления не имеют ничего общего с привычными нам с вами, взвешенными в атмосфере продуктами конденсации водяного пара. На самом деле, под облачными вычислениями следует понимать технологию обработки данных, в которой динамически масштабируемые [...]]]></description>
			<content:encoded><![CDATA[<p><img src="wp-content/uploads/2009/11/224360.jpg" alt="224360" title="224360" width="400" height="267" class="alignleft size-full wp-image-63" /></p>
<p><strong>«Облачные вычисления»</strong>. Первое, что встаёт перед глазами у человека незнакомого с этим термином, так это компьютер, зависший в облаках. На самом деле облачные вычисления не имеют ничего общего с привычными нам с вами, взвешенными в атмосфере продуктами конденсации водяного пара. На самом деле, под облачными вычислениями следует понимать технологию обработки данных, в которой динамически масштабируемые ресурсы предоставляются пользователю в качестве интернет-сервиса. Пользователь не может управлять программным обеспечением в облаке, но имеет доступ к обрабатываемым данным.</p>
<p>Сам термин «облачные вычисления» (англ. Cloud computing) появился ещё в 60-е годы прошлого столетия, но популярность обрёл только в настоящее время в связи с бурным развитием всемирной паутины.</p>
<p>Пользователи могут получать из облака столько системных ресурсов, сколько им необходимо (и конечно столько, сколько могут приобрести). Что для этого используется, и какая внутри инфраструктура, пользователь не может видеть, так как всё это скрывается за стенами виртуальных машин, которые могут работать на огромном количестве серверов и в разных дата-центрах.</p>
<p>Теперь попробуем вкратце разобраться, какие плюсы мы будем иметь, использую облачные вычисления. Во-первых, это очень надёжная инфраструктура с необходимой нам производительностью. Во-вторых, не составит проблемы заниматься масштабированием предоставляемых ресурсов. В-третьих, не нужно оплачивать дикие счета, за использование ресурсов, которыми ты не всегда будешь пользоваться, так как оплата прямо пропорционально зависит от масштабов облака. Особенно это хорошо, когда планируется провести волновую нагрузку на проект.<span id="more-62"></span></p>
<p>Так как облачные вычисления являются одной из передовых технологий, на данный момент имеется множество сервисов для работы с ними. Для удобства их обозначения используют специальную аббревиатуру aaS (“as a Service”). Рассмотрим в общих чертах каждый из этих сервисов.</p>
<p><strong>SaaS</strong> (Software as a service; программное обеспечение как услуга) – сервис, в котором пользователю предлагают использование определённого программного обеспечения по подписке через интернет. Одним из самых ярких примеров здесь будет Google Docs. К тому же доступ к нему абсолютно бесплатен.</p>
<p><strong>PaaS</strong> (Platform as a service; платформа как услуга) – сервис для разработки и поддержки приложений, в котором интегрированы различные необходимые библиотеки и программы. PaaS, в отличие от SaaS ориентирован не на конечного пользователя, а на разработчика. Здесь же самым известным примером является Google AppEngine, предоставляющая хостинг для веб-приложений с возможностью покупать дополнительные вычислительные ресурсы.</p>
<p><strong>IaaS</strong> (Infrastructure as a service; инфраструктура как услуга) – предоставление пользователю аппаратных ресурсов, которые обычно объединены в единое целое с помощью различных технологий виртуализации, которые используются вместо обычного хостинга. Поэтому, когда речь идёт о конкретном железе, понимаются некоторые абстрактные сущности, которые аналогичны обычным аппаратным. IaaS являются различные, привычные пользователю VPS-площадки или просто онлайн хранилища с возможностью автомасштабирования.</p>
<p><strong>СaaS</strong> (Communication as a service; связь, как услуга) – предоставление различных услуг связи (таких как IP-телефония, электронная почта, IM и др.) в виде облака.</p>
]]></content:encoded>
			<wfw:commentRss>/?feed=rss2&amp;p=62</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Есть ли бэкдор в Windows 7?</title>
		<link>/?p=54</link>
		<comments>/?p=54#comments</comments>
		<pubDate>Fri, 20 Nov 2009 11:38:54 +0000</pubDate>
		<dc:creator>Istergul</dc:creator>
				<category><![CDATA[Information Security]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[бэкдор]]></category>

		<guid isPermaLink="false">/?p=54</guid>
		<description><![CDATA[
В среду на этой неделе один из руководителей Агентства Национальной Безопасности США заявил, что АНБ участвовало в разработке операционной системы Windows 7. Также вместе в ними принимали участие в разработке специалисты Министерства обороны. Вместе они «использовали свой уникальный опыт и практические знания в области системных угроз и уязвимостей, чтобы улучшить безопасность операционной системы».
Сразу напрашивается мысль, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-53" title="gates" src="wp-content/uploads/2009/11/gates.jpg" alt="gates" width="140" height="201" />
<p>В среду на этой неделе один из руководителей Агентства Национальной Безопасности США заявил, что АНБ участвовало в разработке операционной системы Windows 7. Также вместе в ними принимали участие в разработке специалисты Министерства обороны. Вместе они «использовали свой уникальный опыт и практические знания в области системных угроз и уязвимостей, чтобы улучшить безопасность операционной системы».</p>
<p>Сразу напрашивается мысль, что Microsoft совместно с АНБ встроили какой-нибудь бэкдор в операционную систему. Мне, как человеку, выступающему категорически против вешания штрих-кодов на людях, эта тема добавила ещё каплю в море моей маниакальности по вопросам безопасности. Это уже не первый случай, когда спецслужбы плотно сотрудничают с Microsoft над созданием очередной операционной системы: Windows Vista, Windows XP и Windows 2000 тоже разрабатывались с учётом рекомендаций АНБ. Хотя все эти годы Microsoft и опровергает слухи о бэкдорах, на уровне подсознания сомнения проходить не спешат.</p>
<p>В четверг официальный представить Microsoft заявил, что Microsoft никогда не внедряла и не будет внедрять «бэкдоры» в Windows. Он заверил, что участие АНБ в создании Windows 7 ограничилось исключительно работой над Security Compliance Management Toolkit, который вышел в конце октября, вскоре после официального релиза операционной системы.</p>
<p>Однако проблема с АНБ действительно есть. Дело в том, что это агентство совмещает в себе две функции: сигнальная разведка (то есть слежка) и компьютерная безопасность. Вполне логично, что в каких-то вопросах эти две сферы будут пересекаться.</p>
<p>Сейчас АНБ пытается наладить сотрудничество с Apple, Sun и Red Hat в области безопасности операционных систем (об этом тоже было сказано в выступлении перед комитетом по терроризму). Чем не повод для новых опасений?</p>
]]></content:encoded>
			<wfw:commentRss>/?feed=rss2&amp;p=54</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Мораторий на развитие Python</title>
		<link>/?p=45</link>
		<comments>/?p=45#comments</comments>
		<pubDate>Thu, 12 Nov 2009 16:55:49 +0000</pubDate>
		<dc:creator>Istergul</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">/?p=45</guid>
		<description><![CDATA[Разработчики Python официально приняли мораторий, запрещающий изменение синтаксиса языка Python версии 3.1 на срок до 26 июня 2011 года. Целью моратория является задержка развития языка, чтобы сторонние проекты для Python догнали в своём развитии Python третьей ветки. Отставание вызвано тем, что вторая и третья ветки являются несовместимыми, и поэтому многие альтернативные проекты Python, такие как [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_46" class="wp-caption alignleft" style="width: 290px"><a href="wp-content/uploads/2009/11/280px-python_logo_2.png"><img class="size-full wp-image-46" title="280px-python_logo_2" src="wp-content/uploads/2009/11/280px-python_logo_2.png" alt="Логотип интерпретатора Python" width="280" height="280" /></a><p class="wp-caption-text">Логотип интерпретатора Python</p></div>
<p>Разработчики Python официально приняли <nofollow><a href="index.html">мораторий</a></nofollow>, запрещающий изменение синтаксиса языка Python версии 3.1 на срок до 26 июня 2011 года. Целью моратория является задержка развития языка, чтобы сторонние проекты для Python догнали в своём развитии Python третьей ветки. Отставание вызвано тем, что вторая и третья ветки являются несовместимыми, и поэтому многие альтернативные проекты Python, такие как Jython,IronPython, Unladen Swallow,  продолжают базироваться на Python 2.7. На время заморозки развития усилия разработчиков будут направлены на портирование библиотек для старой ветки языка на Python 3, написании утилит и документации.<br />
Это всё меня лично очень радует, и я с радостью проголосовал бы за продление моратория, если бы такая возможность представилась, чтобы большинство весомых проектов на Python, такие как Django, PyGTK, wxPython и другие,  успели перелезть на третью ветку языка, и больше не было бы болезненных проблем совместимости. Остаётся надеяться, что это случится как можно скорее.</p>
]]></content:encoded>
			<wfw:commentRss>/?feed=rss2&amp;p=45</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Язык программирования Go</title>
		<link>/?p=35</link>
		<comments>/?p=35#comments</comments>
		<pubDate>Thu, 12 Nov 2009 15:58:56 +0000</pubDate>
		<dc:creator>Istergul</dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[go language]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">/?p=35</guid>
		<description><![CDATA[Неожиданно так для многих из нас Google анонсировал новый язык программирования, в котором разработчики хотят объединить мощность C++ и лаконичность Python. Поэтому, по словам девелоперов, разработка на Go так же быстра, как и разработка на Python, и так же мощна, как на C++ и Java. Пока язык представляет собой эксперимент, который ставит Google, так как [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_38" class="wp-caption alignleft" style="width: 360px"><img class="size-full wp-image-38" title="go_lang" src="wp-content/uploads/2009/11/go_lang.png" alt="Язык программирования Go" width="350" height="197" /><p class="wp-caption-text">Язык программирования Go</p></div>
<p>Неожиданно так для многих из нас Google анонсировал новый <nofollow><a href="http://golang.org&gt;">язык программирования</a></nofollow>, в котором разработчики хотят объединить мощность C++ и лаконичность Python. Поэтому, по словам девелоперов, разработка на Go так же быстра, как и разработка на Python, и так же мощна, как на C++ и Java. Пока язык представляет собой эксперимент, который ставит Google, так как сам Go ещё не достаточно зрелый для серьёзных проектов.</p>
<p>Вот  «хелловорд», представленный на главной странице официального сайта Go:</p>
<blockquote><p>package main</p>
<p>import &#8220;fmt&#8221;</p>
<p>func main() {<br />
fmt.Printf(&#8221;Hello, 世界\n&#8221;)<br />
}</p></blockquote>
<p>Эти начинания, конечно же, хороши. Но вот только возник один небольшой казус. Вот <a href="index.html">дискуссия</a> , в которой Francis McCabe просит компанию Google переименовать язык, так как сам уже в течение десяти лет работает над языком Go! Дискуссия уже представляет собой длинный манускрипт, на которую Google ещё никак не прореагировал. Название, выдвигаемой людьми для языка Google звучит как Issue 9. Так что остаётся очень актуальным вопрос, уступит ли Google, хотя лично я в этом очень сомневаюсь…</p>
]]></content:encoded>
			<wfw:commentRss>/?feed=rss2&amp;p=35</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Краткий обзор популярных GUI библиотек для Python</title>
		<link>/?p=16</link>
		<comments>/?p=16#comments</comments>
		<pubDate>Sun, 08 Nov 2009 13:47:06 +0000</pubDate>
		<dc:creator>Istergul</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[gui]]></category>

		<guid isPermaLink="false">/?p=16</guid>
		<description><![CDATA[


GUI Library
Краткое описание
Лицензия
Платформы
IDE
Документация


wxPython
Модуль расширения Python, описывающий GUI библиотеку wxWidgets, которая реализована на C++.
Free Software Foundation, Open Source Initiative
Windows, Unix, Macintosh OS X.
Boa Constructor, wxGlade
wxPython Tutorial, Книга “WxPython in action”


PyGTK
Набор Python-привязок для библиотеки GTK+.
GNU LGPL
Microsoft Windows, Unix.
Glade
PyGTK Tutorial


PyQT
Привязка Python к графической  библиотеке Qt.
GNU GPL 2, GNU GPL 3, коммерческая
Windows, Unix, Macintosh OS X.
Qt Designer
PyQT Tutorials


Tkinter
Библиотека [...]]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody>
<tr>
<td><strong>GUI Library</strong></td>
<td><strong>Краткое описание</strong></td>
<td><strong>Лицензия</strong></td>
<td><strong>Платформы</strong></td>
<td><strong>IDE</strong></td>
<td><strong>Документация</strong></td>
</tr>
<tr valign="top">
<td>wxPython</td>
<td>Модуль расширения Python, описывающий GUI библиотеку wxWidgets, которая реализована на C++.</td>
<td>Free Software Foundation, Open Source Initiative</td>
<td>Windows, Unix, Macintosh OS X.</td>
<td>Boa Constructor, wxGlade</td>
<td><nofollow><a href="index.html">wxPython Tutorial</a>, <a href="index.html">Книга “WxPython in action”</a></nofollow></td>
</tr>
<tr valign="top">
<td>PyGTK</td>
<td>Набор Python-привязок для библиотеки GTK+.</td>
<td>GNU LGPL</td>
<td>Microsoft Windows, Unix.</td>
<td>Glade</td>
<td><nofollow><a href="index.html">PyGTK Tutorial</a></nofollow></td>
</tr>
<tr valign="top">
<td>PyQT</td>
<td>Привязка Python к графической  библиотеке Qt.</td>
<td>GNU GPL 2, GNU GPL 3, коммерческая</td>
<td>Windows, Unix, Macintosh OS X.</td>
<td>Qt Designer</td>
<td><nofollow><a href="index.html">PyQT Tutorials</a></nofollow></td>
</tr>
<tr valign="top">
<td>Tkinter</td>
<td>Библиотека на основе средств Tcl/Tk, входящая в стандартный дистрибутив Python.</td>
<td>Free Software Foundation, Open Source Initiative</td>
<td>Windows, Unix, Macintosh OS X.</td>
<td>Python Automatic GUI Generator</td>
<td><nofollow><a href="index.html">Tkinter Tutorial</a></nofollow></td>
</tr>
</tr>
<tr valign="top">
<td>pyFLTK</td>
<td>Оболочка для библиотеки Fast Light Tool Kit. Имеется 2 пакета: pyFLTK для FLTK 1.1 и pyFLTK2 для FLTK2.</td>
<td>GNU Library или LGPL</td>
<td>Windows, Unix, Macintosh OS X.</td>
<td>-</td>
<td><nofollow><a href="index.html">pyFLTK Documentation</a></nofollow></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>/?feed=rss2&amp;p=16</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Правила написания эстетичного кода на PHP</title>
		<link>/?p=6</link>
		<comments>/?p=6#comments</comments>
		<pubDate>Tue, 06 Oct 2009 10:32:22 +0000</pubDate>
		<dc:creator>Istergul</dc:creator>
				<category><![CDATA[Programming theory]]></category>
		<category><![CDATA[правила кодирования]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">/?p=6</guid>
		<description><![CDATA[Довольно часто на практике любому программисту приходится сталкиваться с проблемой рефакторинга какого-либо кода. Данный код может быть написан непосредственно им или же другим программистом. Буквально недавно столкнулся с небольшим скриптом на PHP, написанным ужасающим образом. Нет, работал он отлично, всё было при нём, и правильная буферизация, и генерация/обработка исключений. Что же мне не понравилось в [...]]]></description>
			<content:encoded><![CDATA[<p>Довольно часто на практике любому программисту приходится сталкиваться с проблемой рефакторинга какого-либо кода. Данный код может быть написан непосредственно им или же другим программистом. Буквально недавно столкнулся с небольшим скриптом на PHP, написанным ужасающим образом. Нет, работал он отлично, всё было при нём, и правильная буферизация, и генерация/обработка исключений. Что же мне не понравилось в нём? А то, что программист, писавший его, похоже, всё делал на скорую руку, не придёрживаясь никакого определённого стиля кодирования. В одних местах фигурные скобки открывались в одной строке с управляющей структурой, в других, абсолютно равнозначных, переносились на новую; иногда использовалась жёсткая табуляция, иногда мягкая; длина строки и количество операторов в ней не подчинялось никакому логическому умозаключению, и т д, и т п…<span id="more-6"></span></p>
<p>Естественно, читая такой код, радужных чувств не испытываешь. Поэтому хочется отметить, что выбор какого-то определённого стиля кодирования является неотъемлемой частью программирования как такового. Программисты, не делающие этого совершенно недальновидны, так как их код в дальнейшем могут читать другие люди. Или даже сами они через некоторое время пожалеют об этом, когда им придется разбирать собственный код. Именно поэтому выбор стиля довольно важный фактор.<br />
Но если уж вы решили придерживаться какого-то определённого стиля, то так же не стоит писать, используя только его. Например, вам попался в руки проект, где программист, разрабатывавший его, придерживался несколько других стандартов. В этом случае, лучше всего рефакторить проект, используя стиль его первичного автора, дабы не возникло путаницы и противоречий, так как после вас этот проект может достаться третьему человеку, и так далее.<br />
Теперь перейду непосредственно к описанию элементов стилей кодирования.</p>
<h2>1. Табуляция</h2>
<p>Существует два вида табуляции: мягкая и жёсткая. Жёсткая табуляция – использование символа табуляции для получения отступа. Мягкая табуляция – использования необходимого количества пробелов для получения отступа. Лучше всего придерживаться мягкой табуляции в связи с тем, что у каждого редактора свои настройки табуляции. Обычно используют 4 пробела там, где необходим отступ, так как это делает код наиболее читабельным.</p>
<h2>2. Управляющие конструкции</h2>
<p>Использование фигурных скобок в управляющих конструкциях обычно подразделяется на 3 стиля:</p>
<h3>2.1 BSD-стиль:</h3>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> (&lt;условие&gt;)</li>
<li>{</li>
<li>&nbsp;&nbsp;&lt;оператор&gt;</li>
<li>} </li>
</ol>
<p></font></code></p></blockquote>
<h3>2.2 GNU-стиль:</h3>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> (&lt;условие&gt;)</li>
<li>&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;оператор&gt;</li>
<li>&nbsp;&nbsp;} </li>
</ol>
<p></font></code></p></blockquote>
<h3>2.3 K&amp;R-стиль:</h3>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">if</font> (&lt;условие&gt;) {</li>
<li>&nbsp;&nbsp;&lt;оператор&gt;</li>
<li>} </li>
</ol>
<p></font></code></p></blockquote>
<p>В условных операторах и циклах я использую K&amp;R-стиль, в объявлениях функций и классов BSD. Это наиболее удобно, на мой взгляд.</p>
<h2>3. Пробелы</h2>
<p>В вызовах функций лучше не ставить пробел после имени функции, но разделять им список переменных. Например:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">function</font> <a href="index.html">connect</a>(<font color="#cc6633">$arg1</font>, <font color="#cc6633">$arg2</font>)</li>
<li>{</li>
<li>&nbsp;&nbsp;<font color="#696969">//тело&nbsp;функции</font></li>
<li>} </li>
</ol>
<p></font></code></p></blockquote>
<h2>4. Именования</h2>
<h3>4.1 Константы и глобальные переменные</h3>
<p>Имена констант и глобальных переменных лучше всего вводить в верхнем регистре, так как это позволит с лёгкостью идентифицировать их как глобальные:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>$TEMPLATE_DIR = `/template/<font color="#0000ff">default</font>/ `; </li>
</ol>
<p></font></code></p></blockquote>
<h3>4.2 Временные переменные и функции</h3>
<p>Имена временным переменным и функциям следует давать короткие и лаконичные с подчёркиванием для разделения слов. Например:</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li>$count</li>
<li>num_rows() </li>
</ol>
<p></font></code></p></blockquote>
<h3>4.3 Классы</h3>
<p>Первую букву в имени класса следует набирать в верхнем регистре. Символы подчеркивания должны использоваться только для имитации вложенных пространств имен. Имена классов из нескольких слов должны использоваться слитно с первой буквой слова в верхнем регистре.</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">class</font> XML_RSS {}</li>
<li><font color="#0000ff">class</font> Text_PrettyPrinter {} </li>
</ol>
<p></font></code></p></blockquote>
<h3>4.4 Методы и свойства</h3>
<p>Если имя метода или свойства состоит из одного слова, то его нужно полностью набирать в нижнем регистре. Если же имя метода или свойства состоит из нескольких слов, то первую букву слов, начиная со второго, следует набирать в верхнем регистре, тогда как остальные – в нижнем.</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">public</font> <font color="#cc6633">$number</font></li>
<li><font color="#0000ff">public</font> <font color="#cc6633">$NumberOfStudent</font> </li>
</ol>
<p></font></code></p></blockquote>
<p>Приватные методы и свойства должны быть префиксированы знаком подчеркивания.</p>
<blockquote><p><code><font size="2" face="Consolas, Courier New, Courier, Monospace" color="black"><small><a href="index.html">Copy&nbsp;Source</a>&nbsp;|&nbsp;<a href="index.html">Copy&nbsp;HTML</a></small>
<ol>
<li><font color="#0000ff">private function</font> _sort() </li>
</ol>
<p></font></code></p></blockquote>
<p>Это основные элементы стиля кодирования, к которым следует обратить особое внимание для предотвращения запутанности вашего кода.</p>
]]></content:encoded>
			<wfw:commentRss>/?feed=rss2&amp;p=6</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss></body>
