<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Эффективное программирование: текстовое представление переменных в python</title>
	<atom:link href="http://alexlebedev.com/blog/effective-programming-python-variable-inspection/feed/" rel="self" type="application/rss+xml" />
	<link>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/</link>
	<description>Alexander Lebedev writes about software development and outsourcing</description>
	<lastBuildDate>Tue, 16 Feb 2010 17:27:57 -0800</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Саша Антонов</title>
		<link>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/comment-page-1/#comment-15608</link>
		<dc:creator>Саша Антонов</dc:creator>
		<pubDate>Sun, 29 Jun 2008 18:11:35 +0000</pubDate>
		<guid isPermaLink="false">http://alexlebedev.com/blog/effective-programming-python-variable-inspection/#comment-15608</guid>
		<description>&lt;p&gt;да, забавненько получается&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>да, забавненько получается</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: dvska</title>
		<link>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/comment-page-1/#comment-7815</link>
		<dc:creator>dvska</dc:creator>
		<pubDate>Wed, 19 Dec 2007 18:39:25 +0000</pubDate>
		<guid isPermaLink="false">http://alexlebedev.com/blog/effective-programming-python-variable-inspection/#comment-7815</guid>
		<description>&lt;p&gt;Добавил pformat к варианту Юрия:
&lt;code&gt;from pprint import pformat&lt;/p&gt;

&lt;p&gt;class Inspectable(object):
    &quot;&quot;&quot;
    Provide an ability to
    represent class/instance
    attributes itself
    &quot;&quot;&quot;
    def &lt;strong&gt;repr&lt;/strong&gt;(self):
        attrs = self.&lt;strong&gt;class&lt;/strong&gt;.&lt;strong&gt;dict&lt;/strong&gt;.copy()
        attrs.update(self.&lt;strong&gt;dict&lt;/strong&gt;)
        public_attrs = dict((a,v) for a,v in attrs.items() if not (a.startswith(&#039;_&#039;) or callable(v)))
        return &#039;&lt;%s: %s&gt;&#039; % (self.&lt;strong&gt;class&lt;/strong&gt;.&lt;strong&gt;name&lt;/strong&gt;, pformat(public_attrs))&lt;/code&gt;
.. хотя мне ближе подход Евгения Морозова.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Добавил pformat к варианту Юрия:<br />
<code>from pprint import pformat</code></p>
<p>class Inspectable(object):<br />
    """<br />
    Provide an ability to<br />
    represent class/instance<br />
    attributes itself<br />
    """<br />
    def <strong>repr</strong>(self):<br />
        attrs = self.<strong>class</strong>.<strong>dict</strong>.copy()<br />
        attrs.update(self.<strong>dict</strong>)<br />
        public_attrs = dict((a,v) for a,v in attrs.items() if not (a.startswith('_') or callable(v)))<br />
        return '&lt;%s: %s&gt;' % (self.<strong>class</strong>.<strong>name</strong>, pformat(public_attrs))<br />
.. хотя мне ближе подход Евгения Морозова.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Eugene Morozov</title>
		<link>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/comment-page-1/#comment-7506</link>
		<dc:creator>Eugene Morozov</dc:creator>
		<pubDate>Wed, 05 Dec 2007 22:31:58 +0000</pubDate>
		<guid isPermaLink="false">http://alexlebedev.com/blog/effective-programming-python-variable-inspection/#comment-7506</guid>
		<description>&lt;p&gt;Я предпочитаю юнит-тесты. Не люблю загромождать код &quot;лишними&quot; классами, которые:
а) не нужны большую часть времени
б) скорее всего непонятны постороннему читателю кода, особенно учитывая пункт а)&lt;/p&gt;

&lt;p&gt;Юнит-тесты грандиозно сокращают время отладки. Но их нужно не лениться писать.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Я предпочитаю юнит-тесты. Не люблю загромождать код &#8220;лишними&#8221; классами, которые:<br />
а) не нужны большую часть времени<br />
б) скорее всего непонятны постороннему читателю кода, особенно учитывая пункт а)</p>
<p>Юнит-тесты грандиозно сокращают время отладки. Но их нужно не лениться писать.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Mikael</title>
		<link>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/comment-page-1/#comment-4741</link>
		<dc:creator>Mikael</dc:creator>
		<pubDate>Tue, 11 Sep 2007 13:23:51 +0000</pubDate>
		<guid isPermaLink="false">http://alexlebedev.com/blog/effective-programming-python-variable-inspection/#comment-4741</guid>
		<description>&lt;p&gt;Спасибо за статью! Жду продолжения.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Спасибо за статью! Жду продолжения.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Юревич Юрий</title>
		<link>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/comment-page-1/#comment-4096</link>
		<dc:creator>Юревич Юрий</dc:creator>
		<pubDate>Sat, 18 Aug 2007 16:23:25 +0000</pubDate>
		<guid isPermaLink="false">http://alexlebedev.com/blog/effective-programming-python-variable-inspection/#comment-4096</guid>
		<description>&lt;p&gt;Забыл отэкранировать угловые скобки, WP &quot;съел&quot; часть кода.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Забыл отэкранировать угловые скобки, WP &#8220;съел&#8221; часть кода.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Юревич Юрий</title>
		<link>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/comment-page-1/#comment-4095</link>
		<dc:creator>Юревич Юрий</dc:creator>
		<pubDate>Sat, 18 Aug 2007 16:21:52 +0000</pubDate>
		<guid isPermaLink="false">http://alexlebedev.com/blog/effective-programming-python-variable-inspection/#comment-4095</guid>
		<description>&lt;p&gt;Да, конечно. Честнее будет, конечно, проверять атрибут на исполняемость (&lt;code&gt;iscallable&lt;/code&gt;), чем полагаться на &lt;code&gt;&lt;strong&gt;dict&lt;/strong&gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Пример -- ниже:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
&gt;&gt;&gt; class A(object):
   ....:     name = &#039;Inspectable&#039;
   ....:     description = &#039;Some description&#039;
   ....:
   ....:     def __init__(self):
   ....:         self.value = 20
   ....:
   ....:     def method(self):
   ....:         return True
   ....:
   ....:

&gt;&gt;&gt; a = A()

&gt;&gt;&gt; a.__dict__
&gt;&gt; a.dynamic_method = lambda x: True

&gt;&gt;&gt; a.__dict__
 at 0xb7736684&gt;, &#039;value&#039;: 20}

&gt;&gt;&gt; a.__class__.__dict__.copy()
,
 &#039;__doc__&#039;: None,
 &#039;__init__&#039;: ,
 &#039;__module__&#039;: &#039;__main__&#039;,
 &#039;__weakref__&#039;: ,
 &#039;description&#039;: &#039;Some description&#039;,
 &#039;method&#039;: ,
 &#039;name&#039;: &#039;Inspectable&#039;}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Так что наверное оптимальным вариантом будет следующий показывающий все атрибуты - как класса, так и экземпляра):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
class Inspectable(object):
    &quot;&quot;&quot;
    Provide an ability to 
    represent class/instance 
    attributes itself
    &quot;&quot;&quot;
    def __repr__(self):
        attrs = self.__class__.__dict__.copy()
        attrs.update(self.__dict__)
        public_attrs = dict((a,v) for a,v in attrs.items() if not (a.startswith(&#039;_&#039;) or callable(v)))
        return &#039;&#039; % (self.__class__.__name__, public_attrs)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Теперь, с Вашей подачи, использую его. Спасибо.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Да, конечно. Честнее будет, конечно, проверять атрибут на исполняемость (<code>iscallable</code>), чем полагаться на <code><strong>dict</strong></code>.</p>
<p>Пример &#8212; ниже:</p>
<pre><code>
&gt;&gt;&gt; class A(object):
   ....:     name = 'Inspectable'
   ....:     description = 'Some description'
   ....:
   ....:     def __init__(self):
   ....:         self.value = 20
   ....:
   ....:     def method(self):
   ....:         return True
   ....:
   ....:

&gt;&gt;&gt; a = A()

&gt;&gt;&gt; a.__dict__
&gt;&gt; a.dynamic_method = lambda x: True

&gt;&gt;&gt; a.__dict__
 at 0xb7736684&gt;, 'value': 20}

&gt;&gt;&gt; a.__class__.__dict__.copy()
,
 '__doc__': None,
 '__init__': ,
 '__module__': '__main__',
 '__weakref__': ,
 'description': 'Some description',
 'method': ,
 'name': 'Inspectable'}
</code></pre>
<p>Так что наверное оптимальным вариантом будет следующий показывающий все атрибуты &#8211; как класса, так и экземпляра):</p>
<pre><code>
class Inspectable(object):
    """
    Provide an ability to
    represent class/instance
    attributes itself
    """
    def __repr__(self):
        attrs = self.__class__.__dict__.copy()
        attrs.update(self.__dict__)
        public_attrs = dict((a,v) for a,v in attrs.items() if not (a.startswith('_') or callable(v)))
        return '' % (self.__class__.__name__, public_attrs)
</code></pre>
<p>Теперь, с Вашей подачи, использую его. Спасибо.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Alex Lebedev</title>
		<link>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/comment-page-1/#comment-3918</link>
		<dc:creator>Alex Lebedev</dc:creator>
		<pubDate>Mon, 13 Aug 2007 10:02:59 +0000</pubDate>
		<guid isPermaLink="false">http://alexlebedev.com/blog/effective-programming-python-variable-inspection/#comment-3918</guid>
		<description>&lt;p&gt;Еще один момент: &lt;code&gt;dir(object)&lt;/code&gt; и &lt;code&gt;object.__dict__&lt;/code&gt; -- это не одно и тоже!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dir()&lt;/code&gt; вернет вам список доступных атрибутов &lt;strong&gt;и&lt;/strong&gt; методов объекта, а &lt;code&gt;__dict__&lt;/code&gt; -- только атрибуты.  В данном случае вам совершенно незачем выводить список из десятка-другого методов, правда?&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Еще один момент: <code>dir(object)</code> и <code>object.__dict__</code> &#8212; это не одно и тоже!</p>
<p><code>dir()</code> вернет вам список доступных атрибутов <strong>и</strong> методов объекта, а <code>__dict__</code> &#8212; только атрибуты.  В данном случае вам совершенно незачем выводить список из десятка-другого методов, правда?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Alex Lebedev</title>
		<link>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/comment-page-1/#comment-3917</link>
		<dc:creator>Alex Lebedev</dc:creator>
		<pubDate>Mon, 13 Aug 2007 09:59:08 +0000</pubDate>
		<guid isPermaLink="false">http://alexlebedev.com/blog/effective-programming-python-variable-inspection/#comment-3917</guid>
		<description>&lt;p&gt;Если хотите, чтобы результат был отсортирован по ключам, то логичнее использовать &lt;code&gt;pprint.pfromat()&lt;/code&gt; из стандартной библиотеки:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&gt;&gt;&gt; d = {&#039;z&#039;: &#039;y&#039;, &#039;a&#039;: &#039;b&#039;, 1: 3, &#039;b&#039;: 4}
&gt;&gt;&gt; print pprint.pformat(d, indent=2)
{1: 3, &#039;a&#039;: &#039;b&#039;, &#039;b&#039;: 4, &#039;z&#039;: &#039;y&#039;}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;К тому же, &lt;code&gt;pformat()&lt;/code&gt; позволяет легко использовать разные фокусы с форматированием, если вам это интересно:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&gt;&gt;&gt; print pprint.pformat(d, indent=2, width=1)
{ 1: 3,
  &#039;a&#039;: &#039;b&#039;,
  &#039;b&#039;: 4,
  &#039;z&#039;: &#039;y&#039;}
&lt;/code&gt;&lt;/pre&gt;
</description>
		<content:encoded><![CDATA[<p>Если хотите, чтобы результат был отсортирован по ключам, то логичнее использовать <code>pprint.pfromat()</code> из стандартной библиотеки:</p>
<pre><code>&gt;&gt;&gt; d = {'z': 'y', 'a': 'b', 1: 3, 'b': 4}
&gt;&gt;&gt; print pprint.pformat(d, indent=2)
{1: 3, 'a': 'b', 'b': 4, 'z': 'y'}
</code></pre>
<p>К тому же, <code>pformat()</code> позволяет легко использовать разные фокусы с форматированием, если вам это интересно:</p>
<pre><code>&gt;&gt;&gt; print pprint.pformat(d, indent=2, width=1)
{ 1: 3,
  'a': 'b',
  'b': 4,
  'z': 'y'}
</code></pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Alex Lebedev</title>
		<link>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/comment-page-1/#comment-3916</link>
		<dc:creator>Alex Lebedev</dc:creator>
		<pubDate>Mon, 13 Aug 2007 09:49:59 +0000</pubDate>
		<guid isPermaLink="false">http://alexlebedev.com/blog/effective-programming-python-variable-inspection/#comment-3916</guid>
		<description>&lt;blockquote&gt;
  &lt;p&gt;Замечание 1: проверяйте код. В коде до примечания про SA цикл будет не по (k,v), а только по k (забыт .items())&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Спасибо, исправил.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<blockquote>
<p>Замечание 1: проверяйте код. В коде до примечания про SA цикл будет не по (k,v), а только по k (забыт .items())</p>
</blockquote>
<p>Спасибо, исправил.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dmitry</title>
		<link>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/comment-page-1/#comment-3912</link>
		<dc:creator>Dmitry</dc:creator>
		<pubDate>Mon, 13 Aug 2007 08:07:34 +0000</pubDate>
		<guid isPermaLink="false">http://alexlebedev.com/blog/effective-programming-python-variable-inspection/#comment-3912</guid>
		<description>&lt;p&gt;А для юникода вроде бы надо использовать &lt;strong&gt;unicode&lt;/strong&gt;, я прав?&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>А для юникода вроде бы надо использовать <strong>unicode</strong>, я прав?</p>
]]></content:encoded>
	</item>
</channel>
</rss>
