python规范的工作方式与文档中提到的不同

时间:2017-12-25 12:18:23

标签: python-3.x

>>> from mock import *
>>> from urllib import request
>>> mock = Mock(spec=request.Request)
>>> mock.has_data()
<mock.Mock object at 0x...>
>>> mock.has_data.assret_called_with()

来自:https://docs.python.org/3/library/unittest.mock.html#autospeccing

1)声明怎么样&#34; mock.has_data()&#34;因为它在我的系统上抛出错误而工作? 我在请求库中找不到has_data()mentod。

2)假设即使我们有&#34; has_data()&#34;,我怀疑下面的调用是如何工作的并且没有抛出attirbute错误?

例如:mock.has_data.assret_called_with()

在我的情况下使用下面的示例它失败了但python文档中的上述示例并未报告任何错误

from mock import *
from urllib import request
mock = Mock(spec=request.Request)
mock.has_header()
mock.has_header.assret_called_with()

Traceback (most recent call last):
  File ".\test2.py", line 5, in <module>
    mock.has_header.assret_called_with()
  File "C:\Users\hai\AppData\Local\Programs\Python\Python35-32\lib\site-packages\mock\mock.py", line 703, in __getattr__
    raise AttributeError(name)
AttributeError: assret_called_with

请澄清,我对文件的理解或错误是否有问题?

1 个答案:

答案 0 :(得分:0)

文档中的示例已过时(这是一个错误。You can help fixing it)。它的工作原理如Python 3.3所述。 mock.has_data()应在Python 3.4+中引发AttributeError:

  

版本3.4中更改:自3.3以来已弃用的请求方法add_data,has_data,get_data,get_type,get_host,get_selector,get_origin_req_host和is_unverifiable已被删除。

文档应使用request.Request对象(例如mock.has_header())上存在的方法。重点是说明mock.nonexistingAttributeError如果request.Request没有此类属性)和mock.some_existing_attribute.some_nonexisting_attribute(后者不会提升AttributeError甚至之间的差异如果mock.some_existing_attribute没有some_nonexisting_attribute属性):

>>> from unittest.mock import Mock
>>> from urllib import request
>>> mock = Mock(spec=request.Request)
>>> mock.has_header()  # there is request.Request.has_header
<Mock name='mock.has_header()' id='174952746'>
>>> mock.nonexisting   # there is no request.Request.nonexisting
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/...python3.6/unittest/mock.py", line 582, in __getattr__
    raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'nonexisting'
Mock object has no attribute 'nonexisting'
>>> mock.has_header.nonexisting   # no exception but there is no has_header.nonexisting
<Mock name='mock.has_header.nonexisting' id='249631353'>

换句话说,spec不是递归的。