Chinaunix首页 | 论坛 | 博客
  • 博客访问: 444252
  • 博文数量: 97
  • 博客积分: 1552
  • 博客等级: 上尉
  • 技术积分: 1091
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-17 17:05
个人简介

专注于大规模运维场景运维工具解决方案。欢迎有这方面兴趣的朋友跟我联系。

文章分类

全部博文(97)

文章存档

2014年(12)

2013年(25)

2012年(60)

我的朋友

分类: Python/Ruby

2012-07-21 10:50:32

1. doctest
作用:我的理解就是编写一个类或方法的时候可以在注释里面将单元测试写进去。
看下例子:

点击(此处)折叠或打开

  1. def is_between(v, lower, higher):
  2. # Last Change: 2012-07-21 11:07:50
  3.     """
  4.      >>> is_between(5, 1, 9)              
  5.      True
  6.      >>> is_between(3, 3, 9)
  7.      False
  8.     """
  9.     return lower < v < higher

  10. if __name__ == "__main__":
  11.     import doctest
  12.     doctest.testmod()
执行:python test.py -v

点击(此处)折叠或打开

  1. Trying:
  2.     is_between(5, 1, 9)
  3. Expecting: --这个是作者期望的输出
  4.     True
  5. ok
  6. Trying:
  7.     is_between(3, 3, 9)
  8. Expecting:
  9.     False
  10. ok
  11. 1 items had no tests:
  12.     __main__
  13. 1 items passed all tests:
  14.    2 tests in __main__.is_between
  15. 2 tests in 2 items.
  16. 2 passed and 0 failed.
  17. Test passed.
这样的话就可以不用单独编写单元测试了。直接写到方法的docstring里面.
2. namedtuple模块

点击(此处)折叠或打开

  1. >>> from collections import namedtuple
  2. >>> Point=namedtuple('Point','x y',verbose=True)
  3. class Point(tuple):
  4.         'Point(x, y)'

  5.         __slots__ = ()

  6.         _fields = ('x', 'y')

  7.         def __new__(_cls, x, y):
  8.             'Create new instance of Point(x, y)'
  9.             return _tuple.__new__(_cls, (x, y))

  10.         @classmethod
  11.         def _make(cls, iterable, new=tuple.__new__, len=len):
  12.             'Make a new Point object from a sequence or iterable'
  13.             result = new(cls, iterable)
  14.             if len(result) != 2:
  15.                 raise TypeError('Expected 2 arguments, got %d' % len(result))
  16.             return result

  17.         def __repr__(self):
  18.             'Return a nicely formatted representation string'
  19.             return 'Point(x=%r, y=%r)' % self

  20.         def _asdict(self):
  21.             'Return a new OrderedDict which maps field names to their values'
  22.             return OrderedDict(zip(self._fields, self))

  23.         def _replace(_self, **kwds):
  24.             'Return a new Point object replacing specified fields with new values'
  25.             result = _self._make(map(kwds.pop, ('x', 'y'), _self))
  26.             if kwds:
  27.                 raise ValueError('Got unexpected field names: %r' % kwds.keys())
  28.             return result

  29.         def __getnewargs__(self):
  30.             'Return self as a plain tuple. Used by copy and pickle.'
  31.             return tuple(self)

  32.         x = _property(_itemgetter(0), doc='Alias for field number 0')
  33.         y = _property(_itemgetter(1), doc='Alias for field number 1')

  34. >>> point=Point(1,2)
  35. >>> print point.x
  36. 1
  37. 可以看到就是生成一个subclass它里面的属性为这两个值x,y。

3. shlex 模块

点击(此处)折叠或打开

  1. >>> import shlex
  2. >>> text="""a b c"""
  3. >>> print 'original:',repr(text)
  4. original: 'a b c'
  5. >>> lexer=shlex.shlex(text)
  6. >>> for token in lexer:
  7. ... print repr(token)
  8. ...
  9. 'a'
  10. 'b'
  11. 'c'
可以进行字符串分割处理
4. 处理命令行的参数列表
parser.add_argument("--foo",nargs="*")
会将参数拼成一个list里面比如
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument("--foo",nargs="*")
>>> parser.parse_args('a b --foo x y '.split())
Namespace(foo=['x','y'])
拼成一个参数列表
parser.add_argument("--foo",nargs="+")
这个效果其实跟*效果差不多也是拼成一个列表,但是如果没有传一个参数进去的话那就返回一个空的错误信息。必须要有一个元素才行的
parser.add_argument("--foo",nargs=N)
表示接收的参数个数然后输入到一个列表
const 这个参数用来存储常量值(不是来自命令行输入但是又必须)
Action支持如下几种action
store 将会存储参数的值,这个是默认的action如下:
>>> parser=argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.parse_args('--foo 1'.split())
Namespace(foo='1')
store_const 这将会存储这个值到const的常量里面.
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo',action='store_const',const=42)
>>> parser.parse_args('--foo 1'.split())
Namespace(foo=42)
store_true与store_false存储的值为True与False
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo',action='store_true')
>>> parser.add_argument('--bar',action='store_false')
>>> parser.parse_args('--foo --bar'.split())
Namespace(bar=False,foo=True)
append 将元素的值append到一个list里面
>>>parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo',action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1','2'])
append_const 将元素的值append到一个list里面
还可以实现自定义的API。支持__call__:
option_string 将会调用这个API。
>>> class FooAction(argparse.Action):
        def __call__(self,parser,namespace,values,option_string=None):
            print ('%r %r %r' % (namespace,values,option_string))
    setattr(namespace,self.dest,values)
>>>parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo',action=FooAction)
>>> parser.add_argument('bar',action=FooAction)
>>> parser.parse_args('1 --foo 2'.split())
Namespace(bar=None,foo=None)  '1',None
Namespace(bar='1',foo=None)   '2','--foo'
>>>args
Namespace(bar='1',foo='2')


阅读(4238) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~