[关闭]
@spiritnotes 2016-08-21T12:15:44.000000Z 字数 4087 阅读 1472

《Python高手之路》

Python 读书笔记


第一章 项目开始

顶层 1 2 3
foobar(dir)
docs(dir)
conf.py
quickstart.py
index.rst
foobar(dir)
__init__.py
cli.py
tests(dir)
__init__.py
test_cli.py
setup.py
README.RST
requirements.txt
test-requirements.txt
etc(dir)
tools(dir)
bin(dir)
data(dir)

- 版本编号 pep440
- 编码风格与自动检查
- pep8
- pyflakes
- pylint
- flake8
- hacking

第二章 模块和库

第6章 单元测试

6.1 基础知识

测试应该保存在应用程序或库的tests子模块中。可以使测试代码随模块一同分发。一般采用模块树的层次结构作为测试树的层级结构。

6.2 fixture

fixtures模块提供了一些内置的fixtures(EnvironmentVariable),也提哦哪个一种简单的创建类和对象的机制(useFixture)

6.3 模拟(mocking)

mock对象即模拟对象,用来通过某种特殊和可控的方式模拟真实应用程序对象的行为。在创建精确地描述测试代码的状态的环境时,非常有用。

Python2中为mock,Python3中为unit.mock

  1. try:
  2. from unittest import mock
  3. except ImportError:
  4. import mock

Mock基本用法

  1. m = mock.Mock()
  2. m.some_method.return_value = 42
  3. m.some_method.side_effect = f
  4. m.some_method.call_count
  5. m.some_method.assert_called_once_with(... ) # mock.Any 匹配任何参数

补丁函数

  1. with mock.patch('a.b.f', g):
  2. a.b.f() # 调用g

使用装饰器版本

  1. def get_f(code, content):
  2. m = mock.Mock()
  3. m.status_code = code
  4. m.content = content
  5. def f_g(url):
  6. return m
  7. return f_g
  8. class X(unittest.TestCase):
  9. @mock.patch('request.get', get_f(200, 'fd'):
  10. def test_python_is(self):
  11. self.assertTrue(...)

6.4 场景测试

第7章 方法和装饰器

7.1 创建装饰器

装饰器本质上就是一个函数,这个函数接受其他函数作为参数,并且以一个新的修改后的函数进行替换

  1. def identity(f):
  2. return f
  3. _functions = {}
  4. def register(f):
  5. global _functions
  6. _funcitons[f.__name__] = f
  7. return f

新函数缺少原函数的属性,如docstring和名字,使用functools.wraps

  1. def decsrop(f):
  2. @functools.wraps(f)
  3. def wrap(*args, **kwargs):
  4. ...
  5. f(*args, **kwargs)
  6. ...
  7. return wrap

要找特定的函数参数不够智能,使用inspect模块

  1. def desc.(f):
  2. def wraps(*args, **keargs):
  3. func_args = inspect.getcallargs(f, *arg, **kwargs)
  4. if func_args.get('user_name') != 'admin':
  5. raise ...
  6. f(*args, **kwargs)
  7. ...
  8. return wraps

7.2 Python中方法的运行机制

方法是作为类属性保存的函数。

Python3将未绑定方法去掉,而默认作为多一个参数的调用,这样更加灵活,使得该方法处理传入该类的实例外,还可以传入其他任何对象,只要该对象包含方法期望的属性。

采用实例引用方法时,python自动将类的方法绑定到实例。

  1. m = Piz(42).get_size
  2. m.__self__
  3. m = m.__self__.get_szie
  4. m()

7.3 静态方法

静态方法属于类的方法,但实际上并非运行在类的实例上。

  1. P.static_method is P().static_method is P(x).static_method
  1. class A:
  2. @staticmethod
  3. def f():
  4. print(1)
  5. def g(self):
  6. self.f() # 如果f为全局函数,则g在子类必须修改
  7. class B(A):
  8. @staticmethod
  9. def f():
  10. print(2)
  11. b = B()
  12. b.g()

7.4 类方法

类方法是直接绑定到类而非它的实例的方法。

  1. A.cls_method is A(1).cls_nethod is A(2).cls_method
  1. class A:
  2. @classmethod
  3. def from_z(cls, z):
  4. return cls(z)
  5. class B(A):
  6. pass
  7. b = B.from_z(1) # isinstance(b, B)

7.5 抽象方法

使用Python内置的abc模块

  1. class A:
  2. __metaclass__ = abc.ABCMeta
  3. @abc.abstractmethod
  4. def f(self):
  5. pass
  6. class A(metaclass=abc.ABCMeta):
  7. ...

7.6 混合使用静态方法、类方法和抽象方法

  1. class A:
  2. @classmethod
  3. @abc.abstractmethod
  4. def f(cls):
  5. pass

7.7 关于super的真相

Mixin(混入)类是指继承自两个或两个以上的类,并将它们的特性组合在一起。

Python中类也是对象,构建类的特定声明

  1. class classname(expression or inheritance):
  2. ...
  3. class A((lambda: object)()):
  4. pass
  1. class A(object):
  2. pass
  3. print A.mro()
  1. super(B, B()).__init__
  2. super(B).__self__ # 单类调用,返回未绑定的super对象
  3. super(B, B()).__self__

如果是未绑定的super对象,则不能通过它访问类属性,因为其实例未定
- super类实现了描述符协议(__get__)

  1. class D(C):
  2. sup = super(C)
  3. D().sup
  4. D().sup.foo

第8章 函数式编程

在以函数式风格写代码时,函数应该设计成没有其他副作用。函数接受参数生成输出而不保留任何状态或修改任何不反映在返回值中的内容。

函数式变成特点:

8.1 生成器

生成器就是对象,每次调用它的next方法时返回一个值,直到它抛出StopIteration。

包含yield语句的Python函数。Python会将其标识为生成器。可以使用inspect对其进行检查。

  1. inspect.isgeneratorfunction(mygenerator)
  2. inspect.getgeneratorstate(mygenerator) #python3 only

range在python2中是返回列表,Python3中是生成器。

可以通过send对生成器传输值。

8.2 列表解析

可以在单行内构造列表内容。可以使用多个for以及if判断进行过滤,原则上是不限制个数的。
Python2.7之后可以在单行构造字典和集合。

8.3 函数式,函数的,函数化

  1. next(filter(lambda x:x>0, [-1, 0, 1, ...]))
  1. first([-1,0,1], key=partial(operator.le, 0))

第9章 抽象语法树

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注