“类型错误:需要浮点参数,而不是字典”使用 .format 方法时出错



我正在尝试以字符串形式输出与 http 请求相关的数据:

r = requests.post(url, data, params)
assert r.status_code == 200, 'nurl - {}nresponse status - {}nrequest headers - {}nrequest body - {}nresponse headers - {}nresponse body - {}'.format(
        r.url, r.status_code, r.request.headers, r.request.body, r.headers, r.text)

在我的本地机器(python 2.7.5(上运行它效果很好,所有相关数据都被呈现和格式化。

从 Jenkins 构建作业执行此操作时,它会返回异常:

      assert r.status_code == 200, 'nurl - {url}nresponse status - {status}nrequest headers - {r_headers!s}nrequest body - {r_body}nresponse headers - {headers}nresponse body - {body}'.format(
            url=r.url, status=r.status_code, r_headers=r.request.headers, r_body=r.request.body, headers=r.headers,
            body=r.text)
       TypeError: float argument required, not dict

test_watch.py:58:类型错误

通过通过将 .format 方法更改为一次只报告一个变量来进行一些调试,我发现 Jenkins 作业在插入请求标头时字符串格式存在问题。 是的,这是一个字典,但是.format((方法应该可以很好地处理这个问题。 为什么抱怨类型?

完整的回溯并不是很有帮助:

      assert r.status_code == 400, 'Negative test failure' 
                                     'nurl - {url}nresponse status - {status}nrequest headers - {r_headers!s}nrequest body - {r_body}nresponse headers - {headers}nresponse body - {body}'.format(
            url=r.url, status=r.status_code, r_headers=r.request.headers, r_body=r.request.body, headers=r.headers,
            body=r.text)

E 类型错误:需要浮点参数,而不是字典

test_watch.py:58:类型错误

总结一下:这在我的本地机器上有效,请求标头以字符串形式输出:

assert r.status_code == 400, 'Negative test failure' 
                                 'nrequest headers - {r.request.headers}'.format(r=r)

从 Jenkins 构建服务器运行相同的代码:

      assert r.status_code == 400, 'Negative test failure' 
                                     'nrequest headers - {r.request.headers}'.format(r=r)
       TypeError: float argument required, not dict
       test_watch.py:58: TypeError

更新:我更改了代码以捕获TypeError,然后引发了一个自定义的断言错误,以相同的方式从相同的部分构建(我复制/粘贴(。 这非常令人困惑,为什么 .format 以一种方式工作,而另一种方式却完全失败?

try:
            assert r.status_code == 400, 'Negative test failure' 
                                         'nurl - {r.url}nresponse status - {r.status_code}nrequest headers - {r.request.headers}nrequest body - {r.request.body}nresponse headers - {r.headers}nresponse body - {r.text}'.format(r=r)
except TypeError as e:
            message = 'TypeError raised! {}'.format(e)
            message += 'nurl - {r.url}nresponse status - {r.status_code}nrequest headers - {r.request.headers}nrequest body - {r.request.body}nresponse headers - {r.headers}nresponse body - {r.text}'.format(r=r)
            raise AssertionError(message)

执行此代码时,我得到:

E               AssertionError: TypeError raised! float argument required, not dict
E               url - http://api4.qa.ebay.com/user/v1/watchlist/watch?listingStatus=BLARGLE&limit=25
E               response status - 200
E               request headers - {<good headers outputted as a dict>}
E               request body - <good content here>
E               response headers - {no problems}
E               response body - {all my data was printed!}

我仍然不知道为什么会发生此错误,但我能够解决它:

最初的 Jenkins 实例在 Mac OS 10.9.4 上运行我的作业。 将我的作业设置为在 10.9.5 上的新从属服务器中运行,使我的代码无需更改即可成功。

OSX 10.9.4 和 10.9.5 之间是否存在已知问题?

最新更新