Differences between revisions 5 and 6
Revision 5 as of 2004-08-20 19:20:58
Size: 10570
Editor: 211
Comment:
Revision 6 as of 2004-08-20 20:12:33
Size: 11630
Editor: 211
Comment:
Deletions are marked like this. Additions are marked like this.
Line 282: Line 282:

自动获得模块信息的探讨:(初步探索)
例子程序:
{{{
# AMod.py
# module AMod

"""
A demo module for auto get __doc__
This is a module __doc__
"""

def Afun():
    """ Afun 's __doc__ """

class AClass:
    """ AClass __doc__ """
    def __init__(self):
        pass
    
    def classFun():
        """ Class method's __doc__ """
        pass
}}}

获得模块信息:
{{{
# GetInfo.py

import AMod

import inspect
info = """
Module info:
"""

info = info + "Module Name:" + AMod.__name__ + '\n' \
        + "Module file:" + AMod.__file__ + '\n' \
        + "Module doc:" + AMod.__doc__ + '\n\n'




mod_dict = AMod.__dict__

for obj in mod_dict.keys():
    info = info + "%s \n\t%s\n"%(obj, type(mod_dict[obj]))
    if inspect.isroutine(mod_dict[obj]):
        info = info + "\tfunction doc: %s\n"%(mod_dict[obj].__doc__)
    if inspect.isclass(mod_dict[obj]):
        info = info + "\tClass doc: %s\n"%(mod_dict[obj].__doc__)
    
print info

}}}

收集Python 各种方面的技巧片段! -- Zoom.Quiet [DateTime(2004-08-09T23:28:59Z)]

TableOfContents

各种实用代码片段

浮点数的输出格式

>>> a=6200-6199.997841
>>> a
0.0021589999996649567
>>> print "%f"%a
0.002159
>>> import fpformat
>>> fpformat.fix(a, 6)
'0.002159'
>>> print fpformat.fix(a, 6)
0.002159
>>> print "%.6f"%a
0.002159
>>> print "%.7f"%a
0.0021590
>>> print "%.10f"%a
0.0021590000
>>> print "%.5f"%a
0.00216

怎么下载网络上的一张图片到本地

>知道了一张图片的URL >比如http://www.yahoo.com/images/logo.gif >想将它下载到本地保存应该怎么实现?

   1 urllib.urlretrieve(url, filename)

---Limodou

使用locale判断本地语言及编码

from::[http://limodou.donews.net/limodou/posts/11510.aspx limodou的学习记录 ]

在支持unicode软件中,经常需要在不同的编码与unicode之间进行转换。

那么对于一个本地文件的处理,首先要将其内容读出来转换成unicode编码,在软件中处理完毕后,再保存为原来的编码。

如果我们不知道文件的确切编码方式,可以使用默认的编码方式。那么我们可以使用locale模块来判断默认编码方式。

>>>import locale
>>>print locale.getdefaultlocale()
('zh_CN', 'cp936')

可以看出,我的机器上默认语言是简体中文,编码是GBK。

__new__的使用

from: [http://www.linuxforum.net/forum/showflat.php?Cat=&Board=python&Number=487139&page=1&view=collapsed&sb=5&o=31&fpart= 中国Linux论坛 -rings]

new

new是python里object的方法。如果你要重载new,那么你需要继承object。 new是类方法。他不带self参数。 newinit是不一样的。initself参数。所以他是在对象已经被构造好了以后被调用的。而如果你要在对象构造的时候 做一些事情,那么就需要使用newnew的返回值必须是对象的实例。 new一般在 一些模式里非常有用。我们看一个例子。 这个例子是《thinking in python》里的一个Singleton例子

class OnlyOne(object): 
    class __OnlyOne: 
        def __init__(self): 
            self.val = None 
        def __str__(self): 
            return ′self′ + self.val 
            
        instance = None 
        def __new__(cls): # __new__ always a classmethod 
            if not OnlyOne.instance: 
            OnlyOne.instance = OnlyOne.__OnlyOne() 
            return OnlyOne.instance 
        def __getattr__(self, name): 
            return getattr(self.instance, name) 
        def __setattr__(self, name): 
            return setattr(self.instance, name) 

x = OnlyOne() 
x.val = 'sausage' 
print x 
y = OnlyOne() 
y.val = 'eggs' 
print y 
z = OnlyOne() 
z.val = 'spam' 
print z 
print x 
print y 

我们可以看到OnlyOne从object继承而来。

如果你不继承object,那么你的 new就不会在构造的时候来调用。

当x = OnlyOne()的时候,其实就是调用new(OnlyOne), 每次实例化OnlyOne 的时候都会调用。

因为他是类方法。

所以这段代码就是利用这个特性来实现Singleton的。

因为不管构造多少对象,都要调用new.

那么在OnlyOne里保持一个类的属性, instance.

他代表嵌套的_OnlyOne的实例。

所以,对于他,我们只构造一次。

  • 以后每次构造的时候都是 直接返回这个实例的。

所以,在这里, x,y,z 都是同一个实例。

这个方法和典型的用C++ 来实现 Singleton的道理是一样的。

traceback 的处理

from::[http://www.donews.net/limodou/archive/2004/07/09/40045.aspx Limodou的学习记录]

trackback在 Python 中非常有用,它可以显示出现异常(Exception)时代码执行栈的情况。 但当我们捕捉异常,一般是自已的出错处理,因此代码执行栈的信息就看不到了,如果还想显 示的话,就要用到traceback模块了。

这里只是简单的对traceback模块的介绍,不是一个完整的说明,而且只是满足我个人的要求, 更详细的还是要看文档。

打印完整的traceback

让我们先看一个traceback的显示:

>>> 1/0

Traceback (most recent call last):
  File "", line 1, in -toplevel-
    1/0
ZeroDivisionError: integer division or modulo by zero

可以看出 Python 缺省显示的traceback有一个头:第一行,出错详细位置:第二、三行, 异常信息:第四行。也就是说分为三部分,而在traceback可以分别对这三部分进行处理。 不过我更关心完整的显示。

在traceback中提供了print_exc([limit[, file]])函数可以打印出与上面一样的效果。 limit参数是限定代码执行栈的条数,file参数可以将traceback信息输出到文件对象中。缺省的话是输出到错误输出中。举例:

>>> try:
    1/0
except:
    traceback.print_exc()
 
Traceback (most recent call last):
  File "", line 2, in ?
ZeroDivisionError: integer division or modulo by zero

当出现异常sys.exc_info()函数会返回与异常相关的信息。如:

>>> try:
    1/0
except:
    sys.exc_info()

(<class exceptions.ZeroDivisionError at 0x00BF4CC0>, 
<exceptions.ZeroDivisionError instance at 0x00E29DC8>, 
<traceback object at 0x00E29DF0>)

sys.exc_info()返回一个tuple,异常类,异常实例,和traceback。

print_exc()是直接输出了,如果我们想得到它的内容,如何做?使用 format_exception(type, value, tb [,limit]),type, value, tb分别对应 sys.exc_info()对应的三个值。如:

>>> try:
    1/0
except:
    type, value, tb = sys.exc_info()
 print traceback.format_exception(type, value, tb)

['Traceback (most recent call last):\n', '  File "", line 2, in ?\n', 
'ZeroDivisionError: integer division or modulo by zero\n']

这样,我们知道了format_exception返回一个字符串列表,这样我们就可以将其应用到我们的程序中了。

Python多进程处理之参考大全

from:: [http://blog.huangdong.com] (即将成为历史的HD的个人blog,大家默哀) :) 多进程处理让很多开发人员转向了线程处理的操作,但是,在一些特别的情况下,我们必须考虑两个完全不同的系统间的进程通讯。方法很多,最简单的办法就是通过IPC进行操作了。 这几天我一直在寻找这方面的资源,有所收获后,记载下来,收录归档罢。

RemontD是一个python的进程间解决方案,它可以让你的多个进程共享一个dictionary来进行交互操作。

则是一个类RMI的多台服务器远程过程调用的解决方案,但是它支持在本机调用时使用IPC进行操作。

POSH的作者显然是一个线程的憎恨者,他为PyCon DC 2003贡献了POSH,它使得python的进程间可以共享数据。

显然是两个python的IPC简单包装,你可能在不同的平台上要自己仔细试试了。在表面上,两者都说明自己支持Linux平台的。

伟大的ONLAMP总是会给我惊喜,这是使用PHP来操作共享内存的一个非常好的文章,它甚至将IPC在unix下的使用也说的非常的明白了。

这是一个在两年前就看到的一个python操作共享内存的实现,如果必须从头做起,相信这个原始的代码,可以成为一个很好的参考。

将你的Python脚本转换为Windows exe程序

from:: [http://blog.huangdong.com] (即将成为历史的HD的个人blog,大家默哀) :)

将Python的脚本变为一个可以执行的Windows exe程序可能的好处会说出很多,我最喜欢的则是它会让你写的程序更像是一个“程序”罢。但是,凡事有利就有弊,这样必然会让python的一些好处没有了。

你可以从这里找到[http://starship.python.net/crew/theller/py2exe/ py2exe]的相关信息,可以在这里下载到[http://prdownloads.sourceforge.net/py2exe/py2exe-0.4.2.win32-py2.3.exe?download py2exe-0.4.2.win32-py2.3.exe]安装包。 但是它的使用也还是比较麻烦的,需要你自己手工的写一个小的脚本,就像这样:

   1 # setup.py
   2 from distutils.core import setup
   3 import py2exe
   4 
   5 setup(name="myscript",
   6 scripts=["myscript.py"],
   7 )

再通过python的执行:

python setup.py py2exe

来使用。更多的信息上它的网站看罢。

内省的威力

  • Python 可以使用内省的功能,获得丰富的信息。例如,如果我们想知道 dict 具有什么方法,那么我们可以像下面这样:

>>> dir({})
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', 
'__eq__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', 
'__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__str__', 
'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys',
 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
>>> 

好,现在我们得到了一个列表,那么这些都是干什么用的呢? 我们需要更多的信息:

>>> type({}.update)
<type 'builtin_function_or_method'>

上面,我们使用 type() 得知 dict 的 update 方法是一个 'builtin_function_or_method' ,这说明这是一个Python原生代码(在Python源代码中用C写成)。update究竟怎么用呢? 原来 python 已经给我们嵌入了文档:

>>> {}.update.__doc__
'D.update(E) -> None.  Update D from E: for k in E.keys(): D[k] = E[k]'

此处的 doc 是一个函数中的一个文档字符串,另外还有 module,class 的 doc。 在自己写程序时,可以使用类似下面的方法增加doc

>>> def add(a,b):
        """ My demo add method."""
        return a + b

>>> add.__doc__
' My demo add method.'

自动获得模块信息的探讨:(初步探索) 例子程序:

# AMod.py
# module  AMod

"""
A demo module for auto get __doc__
This is a module __doc__
"""

def Afun():
    """    Afun 's __doc__    """

class AClass:
    """    AClass __doc__    """
    def __init__(self):
        pass
    
    def classFun():
        """        Class method's __doc__        """
        pass

获得模块信息:

# GetInfo.py

import AMod

import inspect
info = """
Module info:
"""

info = info + "Module Name:" + AMod.__name__ + '\n' \
        + "Module file:" + AMod.__file__  + '\n'    \
        + "Module doc:" + AMod.__doc__  + '\n\n'




mod_dict = AMod.__dict__

for obj in mod_dict.keys():
    info = info + "%s \n\t%s\n"%(obj, type(mod_dict[obj]))
    if inspect.isroutine(mod_dict[obj]):
        info = info + "\tfunction doc: %s\n"%(mod_dict[obj].__doc__)
    if inspect.isclass(mod_dict[obj]):
        info = info + "\tClass doc: %s\n"%(mod_dict[obj].__doc__)
    
print info

PyTips (last edited 2009-12-25 07:08:33 by localhost)