Использование контекстного менеджера urllib3 вызывает непредвиденную ошибкуPython

Программы на Python
Anonymous
 Использование контекстного менеджера urllib3 вызывает непредвиденную ошибку

Сообщение Anonymous »

Обе функции в этом MRE, по моему мнению, должны выполняться без ошибок.
Я не понимаю, почему с помощью Pool.request("GET", URL) в качестве ответа: должно вызывать любое исключение, учитывая, что нет синтаксических ошибок, указывающих на то, что управление контекстом не поддерживается.

Код: Выделить всё

from urllib3 import PoolManager

URL = "https://httpbin.org/anything"

def func1(): # this runs without error
with PoolManager() as pool:
response = pool.request("GET", URL)
print(response.json())
response.close()

def func2(): # this raises a ValueError exception
with PoolManager() as pool:
with pool.request("GET", URL) as response:
print(response.json())

if __name__ == "__main__":
for func in (func1, func2):
print("Executing", func.__name__)
func()

К сожалению, func2 вызывает исключение. Вот полный вывод (с запутанным происхождением):

Код: Выделить всё

Executing func1
{'args': {}, 'data': '', 'files': {}, 'form': {}, 'headers': {'Accept-Encoding': 'identity', 'Host': 'httpbin.org', 'User-Agent': 'python-urllib3/2.5.0', 'X-Amzn-Trace-Id': 'Root=1-68ff3ea7-0cb79344009934e6782a6cb7'}, 'json': None, 'method': 'GET', 'origin': '999.999.999.999', 'url': 'https://httpbin.org/anything'}
Executing func2
Traceback (most recent call last):
File "/Users/me/Documents/Python/Oct27a.py", line 22, in 
func()
~~~~^^
File "/Users/me/Documents/Python/Oct27a.py", line 15, in func2
with pool.request("GET", URL) as response:
~~~~~~~~~~~~^^^^^^^^^^^^
ValueError: I/O operation on closed file.
Обновление:
По предложению в комментариях я внес следующие изменения:

Код: Выделить всё

from urllib3 import PoolManager

URL = "https://httpbin.org/anything"

def func1(pool):
response = pool.request("GET", URL)
print(response.json())
response.close()

def func2(pool):
with pool.request("GET", URL) as response:
print(response.json())

if __name__ == "__main__":
with PoolManager() as pool:
for func in (func1, func2):
print("Executing", func.__name__)
func(pool)
Это изменение не помогло.

Подробнее здесь: https://stackoverflow.com/questions/798 ... cted-error

Вернуться в «Python»