﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-I smell magic in the air-随笔分类-Python</title><link>http://www.cppblog.com/izualzhy/category/15332.html</link><description>坚持 相信自己</description><language>zh-cn</language><lastBuildDate>Sat, 19 Mar 2011 22:11:10 GMT</lastBuildDate><pubDate>Sat, 19 Mar 2011 22:11:10 GMT</pubDate><ttl>60</ttl><item><title>{转}Python中的枚举</title><link>http://www.cppblog.com/izualzhy/archive/2011/03/08/141379.html</link><dc:creator>izualzhy</dc:creator><author>izualzhy</author><pubDate>Tue, 08 Mar 2011 13:22:00 GMT</pubDate><guid>http://www.cppblog.com/izualzhy/archive/2011/03/08/141379.html</guid><wfw:comment>http://www.cppblog.com/izualzhy/comments/141379.html</wfw:comment><comments>http://www.cppblog.com/izualzhy/archive/2011/03/08/141379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/izualzhy/comments/commentRss/141379.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/izualzhy/services/trackbacks/141379.html</trackback:ping><description><![CDATA[<a href="http://stackoverflow.com/questions/36932/whats-the-best-way-to-implement-an-enum-in-python"><u><font color=#0000ff>什么是最好的方法来实现枚举'Python中的一个'？</font></u></a>
<p>请告诉我这样做在Python枚举认可呢？ </p>
<p>例如，目前我正在写一个游戏，希望能够提出&#8220;上升&#8221;，&#8220;下降&#8221;，&#8220;左&#8221;和&#8220;权利&#8221;。我使用的，因为我还没有想出如何枚举工作蟒蛇，所以我的逻辑是这样的东西散落字符串： </p>
<pre><code>def move(self, direction):
if direction == "up":
# Do something
</code></pre>
<p>我要替换<code>"up"</code>喜欢的东西<code>Directions.up</code></p>
<h4 id=AnswersId>1)</h4>
<table cellSpacing=10 cellPadding=0 width=620 bgColor=#efefef border=0>
    <tbody>
        <tr>
            <td>
            <pre><code>class Directions:
            up = 0
            down = 1
            left = 2
            right =3
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<h4 id=AnswersId>2)</h4>
<table cellSpacing=10 cellPadding=0 width=620 bgColor=#efefef border=0>
    <tbody>
        <tr>
            <td>
            <p>我给了一个1至Kugel补，但另一个更精简选项</p>
            <pre><code>dirUp, dirDown, dirLeft, dirRight = range(4)
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<h4 id=AnswersId>3)</h4>
<table cellSpacing=10 cellPadding=0 width=620 bgColor=#efefef border=0>
    <tbody>
        <tr>
            <td>
            <p>该<code>collections.namedtuple</code>对象可以提供这样一个命名空间： </p>
            <pre><code>&gt;&gt;&gt; import collections
            &gt;&gt;&gt; dircoll=collections.namedtuple(&amp;apos;directions&amp;apos;, (&amp;apos;UP&amp;apos;, &amp;apos;DOWN&amp;apos;, &amp;apos;LEFT&amp;apos;, &amp;apos;RIGHT&amp;apos;))
            &gt;&gt;&gt; directions=dircoll(0,1,2,3)
            &gt;&gt;&gt; directions
            directions(UP=0, DOWN=1, LEFT=2, RIGHT=3)
            &gt;&gt;&gt; directions.DOWN
            1
            &gt;&gt;&gt;
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<h4 id=AnswersId>4)</h4>
<table cellSpacing=10 cellPadding=0 width=620 bgColor=#efefef border=0>
    <tbody>
        <tr>
            <td>
            <p>如果您是使用Python 2.6 +那么你可以使用<a href="http://docs.python.org/dev/library/collections.html#collections.namedtuple" rel=nofollow><u><font color=#0000ff>namedtuple</font></u></a> 。他们有优势，有固定数量的属性，当你需要的所有枚举值，可以使用它就像一个元组。 </p>
            <p>为了更好地控制枚举值，你可以创建自己的枚举类。 </p>
            <pre><code>def enum(args, start=0):
            class Enum(object):
            __slots__ = args.split()
            def __init__(self):
            for i, key in enumerate(Enum.__slots__, start):
            setattr(self, key, i)
            return Enum()
            &gt;&gt;&gt; e_dir = enum(&amp;apos;up down left right&amp;apos;)
            &gt;&gt;&gt; e_dir.up
            0
            &gt;&gt;&gt; e_dir = enum(&amp;apos;up down left right&amp;apos;, start=1)
            &gt;&gt;&gt; e_dir.up
            1
            </code></pre>
            <p>声明<code>__slots__</code>密封的枚举类，没有更多的属性可以被设置为1这是从一个类创建的对象<code>Enum</code>财产。 </p>
            <p>您的<code>namedtuple</code>类也可以<code>namedtuple docs</code>为基础，在这种情况下你也可以得到一个元组的功能。见<tempcode></tempcode>在子类<tempcode></tempcode></p>
            </td>
        </tr>
    </tbody>
</table>
<br>
<script type=text/javascript>google_ad_client = "pub-8305584206526692";/* 468x60, creado 2/05/10 */google_ad_slot = "2051472307";google_ad_width = 610;google_ad_height = 60;</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript></script>
<script src="http://pagead2.googlesyndication.com/pagead/js/r20101117/r20110208/show_ads_impl.js"></script>
<script>google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);</script>
<ins style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0px; BORDER-TOP: medium none; PADDING-LEFT: 0px; VISIBILITY: visible; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: medium none; WIDTH: 610px; PADDING-TOP: 0px; BORDER-BOTTOM: medium none; POSITION: relative; HEIGHT: 60px"><ins id=google_ads_frame3_anchor style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0px; BORDER-TOP: medium none; DISPLAY: block; PADDING-LEFT: 0px; VISIBILITY: visible; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: medium none; WIDTH: 610px; PADDING-TOP: 0px; BORDER-BOTTOM: medium none; POSITION: relative; HEIGHT: 60px"><iframe id=google_ads_frame3 style="LEFT: 0px; POSITION: absolute; TOP: 0px" name=google_ads_frame marginWidth=0 marginHeight=0 src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-8305584206526692&amp;output=html&amp;h=60&amp;slotname=2051472307&amp;w=610&amp;lmt=1299586767&amp;flash=10.1.53.64&amp;url=http%3A%2F%2Faudbel.com%2F0%2F5009691&amp;dt=1299586767671&amp;shv=r20101117&amp;jsv=r20110208&amp;saldr=1&amp;prev_slotnames=6454624949%2C2051472307&amp;correlator=1299586759265&amp;frm=0&amp;adk=3679638102&amp;ga_vid=1204839054.1299586760&amp;ga_sid=1299586760&amp;ga_hid=824728830&amp;ga_fc=0&amp;u_tz=480&amp;u_his=0&amp;u_java=1&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=16&amp;u_nplug=0&amp;u_nmime=0&amp;biw=1007&amp;bih=608&amp;fu=0&amp;ifi=3&amp;dtd=250&amp;xpc=egtEsVAxrN&amp;p=http%3A//audbel.com" frameBorder=0 width=610 scrolling=no height=60 allowTransparency></iframe></ins></ins><br><br>
<h4 id=AnswersId>5)</h4>
<table cellSpacing=10 cellPadding=0 width=620 bgColor=#efefef border=0>
    <tbody>
        <tr>
            <td>
            <p>如果您确信您需要一个枚举，其他人回答<em>如何</em>做到这一点。但是让我们明白你<em>为什么</em>要他们？认识的动机将有助于选择的解决方案。 </p>
            <ul>
                <li>
                <p><strong>原子值</strong>的c -小数目很容易通过周围，字符串是不是。在Python中，&#8220;字符串，如&#8221;行动是完全使用好了很多。此外，任何解决方案，最终只有一个数字更为严重的调试！ </p>
                <li>
                <p><strong>有意义的价值观</strong>中c - ，你经常<em>要</em>处理现有的幻数，而只想说一些语法糖。这不是这里的情况。然而， <em>还有</em>其他有意义的信息想你可能会联想到的方向，如（dx和dy）载体-更多的下文。 </p>
                <li>
                <p><strong>类型检查</strong> -在C，枚举帮助追赶无效的值在编译时。宁可牺牲，但一般的Python编译器中键入检查少。 </p>
                <li>
                <p><strong>反思</strong> （不存在在C枚举） -你想知道所有的有效值。 </p>
                <ul>
                    <li><strong>完成</strong> -编辑器可以显示你的可能值，帮助您键入。 </li>
                </ul>
                </li>
            </ul>
            <h2>弦乐赎回（又名符号） </h2>
            <p>因此，在Python化解决方案的光端，只是使用字符串，可能有/的所有有效的值设置一个列表： </p>
            <pre><code>DIRECTIONS = set([&amp;apos;up&amp;apos;, &amp;apos;down&amp;apos;, &amp;apos;left&amp;apos;, &amp;apos;right&amp;apos;])
            def move(self, direction):
            # only if you feel like checking
            assert direction in DIRECTIONS
            # you can still just use the strings!
            if direction == &amp;apos;up&amp;apos;:
            # Do something
            </code></pre>
            <p>请注意，调试器会告诉你该函数与'了'作为它的参数调用。任何解决方案，其中<code>direction</code>其实<code>0</code>比这<em>更糟糕</em>得多！ </p>
            <p>在语言LISP的家庭，这种用法是被称为<strong>符号</strong> -原子对象可用的将被视为容易为数字， <em>而是带着文本值</em> 。 （准确，符号串类，而是一个单独的类型。然而，Python经常使用正则字符串将使用其中的LISP符号。） </p>
            <h2>命名空间字符串</h2>
            <p>你可以结合的思想， <code>&amp;apos;up&amp;apos;</code>优于<code>UP = &amp;apos;up&amp;apos; ... RIGHT = &amp;apos;right&amp;apos; </code>与其他解决方案。 </p>
            <p>如果你想赶上mispellings（在运行时间）： </p>
            <pre><code>class Directions:
            UP = "up"
            ...
            RIGHT = "right"
            </code></pre>
            <p>如果你想坚持键入一个前缀得到完成，把一类以上： </p>
            <pre><code>from directions import *</code></pre>
            <p>或只是在一个单独的文件，使一个模块。 </p>
            <p>模块允许用户做懒惰<code>Directions.UP</code>跳过前缀 - 取决于你是否认为这是一个加号或减号... （我个人不想被强迫型<code>if</code>如果我使用它的频率）。 </p>
            <h2>对象与功能</h2>
            <p>如果有什么有用的信息/功能性价值与每个？&#8220;正确&#8221;的价值观不仅是一个4任意的，它是X轴正方向上了！ </p>
            <p>如果你在做什么在这<code>def move(self, direction): if direction == &amp;apos;up&amp;apos;: self.y += STEP elif direction == &amp;apos;down&amp;apos;: self.y -= STEP elif direction == &amp;apos;left&amp;apos;: self.x -= STEP elif direction == &amp;apos;right&amp;apos;: self.x += STEP </code>是这样的： </p>
            <pre><code>def move(self, direction):
            self.x += direction.dx * STEP
            self.y += direction.dy * STEP
            </code></pre>
            <p>比你真的喜欢写为： </p>
            <pre><code># Written in full to give the idea.
            # Consider using collections.namedtuple
            class Direction(object):
            def __init__(self, dx, dy, name):
            self.dx = dx
            self.dy = dy
            self.name = name
            def __str__(self):
            return name
            UP = Direction(0, 1, "up")
            ...
            RIGHT = Direction(1, 0, "right")
            </code></pre>
            <p>，就是这样！ </p>
            <p>所以，你想要的东西，变成这个<strong>实例</strong> ： </p>
            <pre><code>class Direction(object):
            pass
            class Up(Direction):
            dx = 0
            dy = 1
            ...
            class Right(Direction):
            dx = 1
            dy = 0
            </code></pre>
            <p>或只是<strong>类</strong> ： </p>
            <pre><code>direction == Up</code></pre>
            <p>请记住，在Python中，类也是对象（从任何其他对象不同），你可以对它们进行比较： <tempcode></tempcode>等等</p>
            <p>一般来说，情况可能更清洁，但如果你列举的概念有一定的层次关系，他们直接与班有时建模是非常好的。 </p>
            </td>
        </tr>
    </tbody>
</table>
<br>
<h4 id=AnswersId>6)</h4>
<table cellSpacing=10 cellPadding=0 width=620 bgColor=#efefef border=0>
    <tbody>
        <tr>
            <td>
            <p>这是简单而有效的： </p>
            <pre><code>class Enum(object):
            def __init__(self, *keys):
            self.__dict__.update(zip(keys, range(len(keys))))
            </code></pre>
            <p>用法： </p>
            <pre><code>&gt;&gt;&gt; x = Enum(&amp;apos;foo&amp;apos;, &amp;apos;bar&amp;apos;, &amp;apos;baz&amp;apos;, &amp;apos;bat&amp;apos;)
            &gt;&gt;&gt; x.baz
            2
            &gt;&gt;&gt; x.bat
            3
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/izualzhy/aggbug/141379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/izualzhy/" target="_blank">izualzhy</a> 2011-03-08 21:22 <a href="http://www.cppblog.com/izualzhy/archive/2011/03/08/141379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>py2exe【转】</title><link>http://www.cppblog.com/izualzhy/archive/2010/11/02/132100.html</link><dc:creator>izualzhy</dc:creator><author>izualzhy</author><pubDate>Tue, 02 Nov 2010 02:48:00 GMT</pubDate><guid>http://www.cppblog.com/izualzhy/archive/2010/11/02/132100.html</guid><wfw:comment>http://www.cppblog.com/izualzhy/comments/132100.html</wfw:comment><comments>http://www.cppblog.com/izualzhy/archive/2010/11/02/132100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/izualzhy/comments/commentRss/132100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/izualzhy/services/trackbacks/132100.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 11pt"><strong>一、简介</strong></span><br><br>py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具，这样，你就可以不用装python而在windows系统上运行这个可执行程序。<br><br>py2exe已经被用于创建wxPython,Tkinter,Pmw,PyGTK,pygame,win32com&nbsp;client和server,和其它的独立程序。py2exe是发布在开源许可证下的。<br><br><span style="FONT-SIZE: 11pt"><strong>二、安装py2exe</strong></span><br><br>从<a href="http://prdownloads.sourceforge.net/py2exe" target=_blank><u><font color=#7a99a8 size=2>http://prdownloads.sourceforge.net/py2exe</font></u></a>下载并运行与你所安装的Python对应的py2exe版本的installer，这将安装py2exe和相应的例子；这些例子被安装在lib\site-packages\py2exe\samples目录下。<br><br><span style="FONT-SIZE: 11pt"><strong>三、py2exe的用法</strong></span><br><br>如果你有一个名为helloworld.py的python脚本，你想把它转换为运行在windows上的可执行程序，并运行在没有安装python的windows系统上，那么首先你应写一个用于发布程序的设置脚本例如mysetup.py，在其中的setup函数前插入语句import&nbsp;py2exe&nbsp;。<br>mysetup.py示例如下:<br>#&nbsp;mysetup.py<br>from&nbsp;distutils.core&nbsp;import&nbsp;setup<br>import&nbsp;py2exe<br><br>setup(console=["helloworld.py"])<br>然后按下面的方法运行mysetup.py:<br>python&nbsp;mysetup.py&nbsp;py2exe<br>上面的命令执行后将产生一个名为dist的子目录，其中包含了helloworld.exe,python24.dll,library.zip这些文件。<br>如果你的helloworld.py脚本中用了已编译的C扩展模块，那么这些模块也会被拷贝在个子目录中，同样，所有的dll文件在运行时都是需要的，除了系统的dll文件。<br>dist子目录中的文件包含了你的程序所必须的东西，你应将这个子目录中的所有内容一起发布。<br><br>默认情况下，py2exe在目录dist下创建以下这些必须的文件：<br>1、一个或多个exe文件。<br>2、python##.dll。&nbsp;<br>3、几个.pyd文件，它们是已编译的扩展名，它们是exe文件所需要的；加上其它的.dll文件，这些.dll是.pyd所需要的。<br>4、一个library.zip文件，它包含了已编译的纯的python模块如.pyc或.pyo<br>上面的mysetup.py创建了一个控制台的helloword.exe程序，如果你要创建一个图形用户界的程序，那么你只需要将mysetup.py中的console=["helloworld.py"]替换为windows=["myscript.py"]既可。<br><br>py2exe一次能够创建多个exe文件，你需要将这些脚本文件的列表传递给console或windows的关键字参数。如果你有几个相关联的脚本，那么这是很有用的。<br>运行下面个命令，将显示py2exe命令的所有命令行标记。<br>python&nbsp;mysetup.py&nbsp;py2exe&nbsp;--help<br><br><span style="FONT-SIZE: 11pt"><strong>四、指定额外的文件</strong></span><br>一些应用程序在运行时需要额外的文件，诸如配置文件、字体、位图。<br>如果在安装脚本中用data_files可选项指定了那些额外的文件，那么py2exe能将这些文件拷贝到dist子目录中。data_files应包含一个元组(target-dir,&nbsp;files)列表，其中的files是这些额外的文件的列表。<br>示例如下：<br>#&nbsp;mysetup.py<br>from&nbsp;distutils.core&nbsp;import&nbsp;setup<br>import&nbsp;glob<br>import&nbsp;py2exe<br><br>setup(console=["helloworld.py"],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data_files=[("bitmaps",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;["bm/large.gif",&nbsp;"bm/small.gif"]),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;("fonts",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glob.glob("fonts\\*.fnt"))],<br>)<br>说明：data_files选项将创建一个子目录dist\bitmaps，其中包含两个.gif文件；一个子目录dist\fonts，其中包含了所有的.fnt文件。<br><br><span style="FONT-SIZE: 11pt"><strong>五、Windows&nbsp;NT&nbsp;services</strong></span><br><br>你可以通过传递一个service关键字参数给setup函数来建造Windows&nbsp;NT&nbsp;services<br>,这个service参数的值必须是一个Python模块名(包含一service类)的列表。<br>示例如下：<br>#&nbsp;mysetup.py<br>from&nbsp;distutils.core&nbsp;import&nbsp;setup<br>import&nbsp;py2exe<br><br>setup(service=["MyService"])<br>所建造的可执行的service是可以通过在其后跟一定的命令行参数标记来自行安装和卸载的。你可以通过在这个可执行的service(exe)后跟一-help参数来得到更多的帮助。<br><span style="FONT-SIZE: 11pt"><strong>六、COM&nbsp;servers</strong></span><br><br>你可以通过传递一个com_server&nbsp;关键字参数给setup函数来建造Windows&nbsp;NT&nbsp;services<br>,这个service参数的值必须是一个Python模块名(包含一个或多个COM&nbsp;server&nbsp;类)的列表。<br>示例如下：<br>#&nbsp;mysetup.py<br>from&nbsp;distutils.core&nbsp;import&nbsp;setup<br>import&nbsp;py2exe<br><br>setup(com_server=["win32com.server.interp"])<br>默认情况下，DLL和EXE&nbsp;servers被建造，你不需要它们的话你可以简单的删除它们。<br>
<p>原文地址：</p>
<p><a href="http://www.cnblogs.com/jans2002/archive/2006/09/30/519393.html"><u><font color=#7a99a8 size=2>http://www.cnblogs.com/jans2002/archive/2006/09/30/519393.html</font></u></a></p>
<img src ="http://www.cppblog.com/izualzhy/aggbug/132100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/izualzhy/" target="_blank">izualzhy</a> 2010-11-02 10:48 <a href="http://www.cppblog.com/izualzhy/archive/2010/11/02/132100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>