gpt4 book ai didi

python - isinstance() 因未知原因返回 False

转载 作者:行者123 更新时间:2023-11-28 18:33:27 24 4
gpt4 key购买 nike

所以,情况是这样的:
我正在使用 GAE Pipeline lib对于流程,我的 FanoutPipeline 类派生自库中的 Pipeline 类:

from pipeline import pipeline
class FanoutPipeline(pipeline.Pipeline):

当管道进程运行时,它会进行检查以验证该对象实际上是派生自 Pipeline 的类的实例,但它返回 False:

  yielded = pipeline_iter.send(next_value)
# here I check that yielded is an object of `FanoutPipeline`
# class, plz see logs output below
if isinstance(yielded, Pipeline): # returns false here

我添加了大量日志来获取类树及其模块:

  import inspect
logging.debug('Yielded: {}'.format(yielded))
for cls in inspect.getmro(yielded.__class__):
logging.debug('Yielded base: {}'.format(inspect.getmodule(cls)))
logging.debug('Yielded base: {}'.format(cls))
logging.debug('PipelineMeta classes: {}'.format(_PipelineMeta._all_classes))
logging.debug('Pipeline: {}'.format(Pipeline))
logging.debug('Pipeline module: {}'.format(inspect.getmodule(Pipeline)))
for cls in inspect.getmro(Pipeline):
logging.debug(inspect.getmodule(cls))
if isinstance(yielded, Pipeline):

得到输出:

D 21:55:48.079 Yielded: project.handlers.pipeline_gcm.FanoutPipeline(*(None, {u'campaign_id': u'xxx', u'campaign_name': u'xmas notification', u'execution': {u'action': u'market', u'conditions': {u'delayBetweenNotificationsHours': 0, u'in... (515 bytes), **{})
D 21:55:48.079 Yielded base: <module 'project.handlers.pipeline_gcm' from '/base/data/home/apps/s~project-dev3/9.389913797024223872/projects/handlers/pipeline_gcm.pyc'>
D 21:55:48.079 Yielded base: <class 'project.handlers.pipeline_gcm.FanoutPipeline'>
D 21:55:48.080 Yielded base: <module 'pipeline.pipeline' from '/base/data/home/apps/s~project-dev3/9.389913797024223872/libraries/pipeline/pipeline.pyc'>
D 21:55:48.080 Yielded base: <class 'pipeline.pipeline.Pipeline'>
D 21:55:48.080 Yielded base: <module '__builtin__' (built-in)>
D 21:55:48.080 Yielded base: <type 'object'>
D 21:55:48.081 PipelineMeta classes: [<class 'libraries.pipeline.pipeline.Pipeline'>]
D 21:55:48.081 Pipeline: <class 'libraries.pipeline.pipeline.Pipeline'>
D 21:55:48.081 Pipeline module: <module 'libraries.pipeline.pipeline' from '/base/data/home/apps/s~project-dev3/9.389913797024223872/libraries/pipeline/pipeline.pyc'>
D 21:55:48.082 <module 'libraries.pipeline.pipeline' from '/base/data/home/apps/s~project-dev3/9.389913797024223872/libraries/pipeline/pipeline.pyc'>
D 21:55:48.082 <module '__builtin__' (built-in)>

如您所见,yielded 在基类中显然有 pipeline.pipeline.Pipeline,模块路径匹配。

以下是为什么会发生这种情况的一些想法:1. 对象以某种方式在进程之间传递,并且检查失败,因为一个基类在一个进程中加载​​,另一个基类在另一个进程中加载​​。2. 相对路径不同,即pipeline.pipeline模块在创建对象的过程中
和 libraries.pipeline.pipeline 在使用它的过程中并且正在完成 isinstance 检查。

你能帮我解决这个问题吗?我应该首先尝试什么?失败的原因可能是什么?

最佳答案

您正在导入该类的两个版本,一个是libraries.pipeline.pipeline.Pipeline,另一个是pipeline.pipeline.Pipeline。这意味着您同时拥有 /base/data/home/apps/s~project-dev3/9.389913797024223872//base/data/home/apps/s~project-dev3/9.389913797024223872/librariessys.path 中。尽管您知道它们只是同一模块的两条路径,但 python 并不知道这一点并将它们视为两个不同的类。

您需要决定是要将导入基于 libraries 还是基于 libraries 中的各种模块,然后一致地编写导入。您还应该停止将“未选择的”目录添加到 sys.path,以免以错误的方式导入模块失败。

关于python - isinstance() 因未知原因返回 False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34770488/

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