gpt4 book ai didi

python - len 和 str.splitlines() 的奇怪行为

转载 作者:行者123 更新时间:2023-11-28 18:38:07 25 4
gpt4 key购买 nike

我正在使用 requests 发出 HTTP 请求库,我想制作一个简单的响应对象来解析我的数据。我遇到的问题如下。将响应对象传递给我的 ApiResponse 时,我将 Response.text 分成几行,对它们进行计数并了解它是多行还是单行。问题是分割线列表在应用 len() 时给我一个错误,但在控制台中它工作正常。

这是类:

class ApiResponse(object):
pattern = re.compile(r'([a-zA-Z]+): ([a-zA-Z0-9]+)') # original ([a-zA-Z]+)\: ([a-zA-Z0-9]+)
response_type = ResponseType.OK
response_mode = ResponseMode.SINGLE

def __init__(self, r: resp):
self.r = r
self.parse(r)
self.data = None

def parse(self, r: resp):
"""
Method that parses the response from the API
:param r:Response
"""
if r.status_code != 200:
self.response_type = ResponseType.ERR

if len(r.text.splitlines()) > 1:
self.response_mode = ResponseMode.MULTI

for line in r.text.splitlines():
match = self.pattern.search(line)
if match is None:
break
print(match.group(1, 2)) # REMOVE testing
self.response_type = ResponseType[match.group(1)]

这是控制台输出:

>>> import sys
>>> print(sys.version)
3.4.2 (default, Oct 8 2014, 13:08:17)
[GCC 4.9.1]
>>> import requests
>>> from clickapy.response import ApiResponse
>>> r = requests.get(API_URL, {'user': USER, 'password': PASS, 'api_id': API_ID})
>>> api_response = ApiResponse(r)
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/home/eefret/PycharmProjects/clickapy/clickapy/response.py", line 32, in __init__
self.parse(r)
File "/home/eefret/PycharmProjects/clickapy/clickapy/response.py", line 43, in parse
if len(r.text.splitlines()) > 1:
TypeError: object of type 'builtin_function_or_method' has no len()
>>> len(r.text.splitlines())
1

为什么会这样?这对我来说没有意义,我正在执行相同的代码片段,欢迎任何帮助或反馈。

最佳答案

我的一个 friend (全部归功于 Mariano Garcia)帮助了我,因为他没有 SO 帐户,我将发布解决此行为的方法,我的控制台正在强制执行 utf-8 但在内部文本仍然必须进行编码所以是什么解决了这个改变这个 if len(r.text.splitlines()) > 1: 到这个if len(r.text.encode("utf-8").splitlines()) > 1:

完整代码:

class ApiResponse(object):
pattern = re.compile(r'([a-zA-Z]+): ([a-zA-Z0-9]+)') # original ([a-zA-Z]+)\: ([a-zA-Z0-9]+)
response_type = ResponseType.OK
response_mode = ResponseMode.SINGLE

def __init__(self, r: resp):
self.r = r
self.parse(r)
self.data = None

def parse(self, r: resp):
"""
Method that parses the response from the API
:param r:Response
"""
if r.status_code != 200:
self.response_type = ResponseType.ERR

if len(r.text.encode("utf-8").splitlines()) > 1:
self.response_mode = ResponseMode.MULTI

for line in r.text.splitlines():
match = self.pattern.search(line)
if match is None:
break
print(match.group(1, 2)) # REMOVE testing
self.response_type = ResponseType[match.group(1)]

关于python - len 和 str.splitlines() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30443548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com