当前位置: 首页 > 面试题库 >

isinstance()意外返回False

徐高懿
2023-03-14
问题内容

我正在使用kubernetes python客户端。如果我的代码启动时kubernetes不可用,我想重试连接。

当客户端无法连接时,它会抛出一个urllib3.exceptions.MaxRetryError异常,因此我从以下内容开始:

import time
import urllib3

import kubernetes

kubernetes.config.load_kube_config()
api = kubernetes.client.CoreV1Api()

while True:
    try:
        w = kubernetes.watch.Watch()
        for event in w.stream(api.list_pod_for_all_namespaces):
            print event
    except urllib3.exceptions.HTTPError:
        print('retrying in 1 second')
        time.sleep(1)

但这完全失败了;它的行为就像没有任何except声明,并且可以解决:

urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='192.168.122.140', port=8443): Max retries exceeded with url: /api/v1/pods?watch=True (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x2743110>: Failed to establish a new connection: [Errno 111] Connection refused',))

我以为也许我不像我想象的那样理解继承,所以我将上述内容替换为:

except urllib3.exceptions.MaxRetryError:
    print('retrying in 1 second')
    time.sleep(1)

以相同的方式失败。为了弄清楚发生了什么,我添加了一个except包罗万象并调用pdb:

except Exception as err:
    import pdb; pdb.set_trace()

pdb提示符处,我们可以看到:

(Pdb) type(err)
<class 'urllib3.exceptions.MaxRetryError'>

…看起来不错,MRO也一样:

(Pdb) import inspect
(Pdb) inspect.getmro(err.__class__)
(<class 'urllib3.exceptions.MaxRetryError'>, <class 'urllib3.exceptions.RequestError'>, <class 'urllib3.exceptions.PoolError'>, <class 'urllib3.exceptions.HTTPError'>, <type 'exceptions.Exception'>, <type 'exceptions.BaseException'>, <type 'object'>)

但是尽管如此:

(Pdb) isinstance(err, urllib3.exceptions.MaxRetryError)
False

并且所有路径看起来都是合理的:

(Pdb) urllib3.__file__
'/usr/lib/python2.7/site-packages/urllib3/__init__.pyc'
(Pdb) kubernetes.client.rest.urllib3.__file__
'/usr/lib/python2.7/site-packages/urllib3/__init__.pyc'

那么…这里到底发生了什么?

更新资料

这是完整的堆栈跟踪:

Traceback (most recent call last):
  File "testkube.py", line 13, in <module>
    for event in w.stream(api.list_pod_for_all_namespaces):
  File "/usr/lib/python2.7/site-packages/kubernetes/watch/watch.py", line 116, in stream
    resp = func(*args, **kwargs)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/apis/core_v1_api.py", line 14368, in list_pod_for_all_namespaces
    (data) = self.list_pod_for_all_namespaces_with_http_info(**kwargs)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/apis/core_v1_api.py", line 14464, in list_pod_for_all_namespaces_with_http_info
    collection_formats=collection_formats)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/api_client.py", line 335, in call_api
    _preload_content, _request_timeout)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/api_client.py", line 148, in __call_api
    _request_timeout=_request_timeout)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/api_client.py", line 371, in request
    headers=headers)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/rest.py", line 250, in GET
    query_params=query_params)
  File "/usr/lib/python2.7/site-packages/kubernetes/client/rest.py", line 223, in request
    headers=headers)
  File "/usr/lib/python2.7/site-packages/urllib3/request.py", line 66, in request
    **urlopen_kw)
  File "/usr/lib/python2.7/site-packages/urllib3/request.py", line 87, in request_encode_url
    return self.urlopen(method, url, **extra_kw)
  File "/usr/lib/python2.7/site-packages/urllib3/poolmanager.py", line 321, in urlopen
    response = conn.urlopen(method, u.request_uri, **kw)
  File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 668, in urlopen
    **response_kw)
  File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 668, in urlopen
    **response_kw)
  File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 668, in urlopen
    **response_kw)
  File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 639, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/lib/python2.7/site-packages/urllib3/util/retry.py", line 388, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='192.168.122.140', port=8443): Max retries exceeded with url: /api/v1/pods?watch=True (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x3d16110>: Failed to establish a new connection: [Errno 111] Connection refused',))

问题答案:

您的代码对requests程序包具有间接依赖关系,并且requests程序包具有名为的奇怪子模块requests.packages。它曾经包含来自多个依赖项(包括)的复制源代码urllib3,但他们停止这样做。他们想保持requests.packages向后兼容性,所以现在他们做的事情很奇怪。

urllib3。根据requests版本的不同,它可能还会设置许多其他sys.modules`条目。例如,从请求2.18.4开始,源代码会

for package in ('urllib3', 'idna', 'chardet'):
    locals()[package] = __import__(package)
    # This traversal is apparently necessary such that the identities are
    # preserved (requests.packages.urllib3.* is urllib3.*)
    for mod in list(sys.modules):
        if mod == package or mod.startswith(package + '.'):
            sys.modules['requests.packages.' + mod] = sys.modules[mod]

但在2.17.0中,

import urllib3
sys.modules['requests.packages.urllib3'] = urllib3

import idna
sys.modules['requests.packages.idna'] = idna

import chardet
sys.modules['requests.packages.chardet'] = chardet

此代码与导入包的子模块交互不良。如果某些代码尝试执行该操作,import requests.packages.urllib3.exceptions而Python找不到sys.modules['requests.packages.urllib3.exceptions']条目,则Python将
重新创建
urllib3.exceptions模块并进行设置urllib3.exceptions,并设置sys.modules['requests.packages.urllib3.exceptions']到新模块(但不会涉及sys.modules['urllib3.exceptions']。这将生成所涉及类的新副本,从而导致您的错误)。

早在5月份就报告了一个具有相同原因的相关问题,导致了2.18.4中显示的新代码。2.18.4不应引起您所看到的特定问题,但是它仍然很脆弱,因为如果urllib3在用requests.packages拧紧时尚未加载的任何子模块sys.modules,这些子模块将表现出与您今天看到的相同的问题。



 类似资料:
  • 对于这些样式,如果我增加宽度,元素将从左侧增长。这意味着getBoundingClientRect()。在我调整宽度后,该元素的右边应该有相同的值。 但是当我使用javascript来增加宽度时,情况就不一样了。为什么不呢? 当鼠标在元素上移动时,我会增加宽度,如下所示: 每次的输出都是不同的。

  • 问题内容: 我正在尝试使用BeautifulSoup从html文档中获取一些文本。在我看来,这很奇怪,它产生了一个奇怪而有趣的结果:在某一点之后,汤在文本中充满了多余的空格(空格将每个字母与下一个字母分隔开)。我试图在网络上搜索以找到原因,但是我只遇到了有关相反错误的一些消息(根本没有空格)。 您对它为什么会发生以及如何解决此问题有任何建议或提示吗? 这是我创建的非常基本的代码: 这是从结果中提取

  • 我使用了以下映射:我修改了英语分析器来使用ngram分析器,如下所示,这样我应该能够在以下情况下进行搜索:1]部分搜索和特殊字符搜索2]以获得语言分析器的优势 将我的数据索引如下:

  • 问题内容: 我正在尝试使用Java的SimpleDateFormat来解析带有以下代码的日期字符串。 我期待一些解析错误。但有趣的是,它打印以下字符串。 无法推理出来。有人可以帮忙吗? 谢谢 问题答案: 已将其解析为 月份 号2011,因为month()是日期模式的第一部分。 如果将2011个月加到28年,则得到195年。 2011个月是167年零7个月。七月是第七个月。您将02指定为日,将28指

  • [`const express=require('express');const app=express();const https=require('https'); 常量url=“https://api.thevirustracker.com/free-api?countrytimeline=US”; app.get(“/”,(req,res)=>{res.send(“server is ru

  • 我使用Laravel查询生成器来获取一组行,按2列排序,然后(以前为)。然而,结果按(正确)对它们进行排序,但是(或)的次要顺序是不正确的。我是不是搞错了,是不是搞错了? 以下是我的问题: 这反过来又返回: 你看,14号票的顺序是71,75,72,而不是71,72,75。 以下是表格结构: