【问题标题】:Is there a way to know if an object has a non-iterable NoneType object inside有没有办法知道一个对象内部是否有一个不可迭代的 NoneType 对象
【发布时间】:2020-06-01 22:44:56
【问题描述】:

所以我使用vininfo 仅使用它们的 VIN 从外部数据库中填充有关某些单元的信息,并使用这些数据将其转换为 dict 使用 annotate()annotate().items() 但脚本崩溃了

TypeError: cannot unpack non-iterable NoneType object

尝试使用hasattr(obj, 'attr'),但它在那里爆炸并出现相同的错误。无法使用 for..in 进行迭代,因为该对象不是可迭代的 TypeError: 'NoneType' object is not iterable

我尝试了具有相同 VIN 的 CLI 版本,它吐出相同的 cannot unpack 错误。

问题是我用来测试的这个 VIN 缺少一些数据 .transmission 准确地说(但我猜它会发生在任何其他字段),可能是由于填写注册表时拼写错误,所以我'试图忽略这个字段,但我不能,因为它不存在!

VIN 是:1NKZXPEX4GJ109010

Traceback 如下:

Traceback (most recent call last):
  File "c:\program files\python37\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\program files\python37\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Program Files\Python37\Scripts\vininfo.exe\__main__.py", line 7, in <module>
  File "c:\program files\python37\lib\site-packages\vininfo\cli.py", line 51, in main
    entry_point(obj={})
  File "c:\program files\python37\lib\site-packages\click\core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "c:\program files\python37\lib\site-packages\click\core.py", line 717, in main
    rv = self.invoke(ctx)
  File "c:\program files\python37\lib\site-packages\click\core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "c:\program files\python37\lib\site-packages\click\core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "c:\program files\python37\lib\site-packages\click\core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "c:\program files\python37\lib\site-packages\vininfo\cli.py", line 35, in show
    out(details)
  File "c:\program files\python37\lib\site-packages\vininfo\cli.py", line 24, in out
    for k, v in annotatable.annotate().items():
  File "c:\program files\python37\lib\site-packages\vininfo\common.py", line 17, in annotate
    value = getattr(self, attr_name, no_attr)
  File "c:\program files\python37\lib\site-packages\vininfo\details\_base.py", line 53, in __get__
    return DetailWrapper(instance, self)
  File "c:\program files\python37\lib\site-packages\vininfo\details\_base.py", line 20, in __init__
    attr_name, attr_idx = detail.source
TypeError: cannot unpack non-iterable NoneType object

【问题讨论】:

标签: python iterable nonetype iterable-unpacking


【解决方案1】:

您可以强制传输到一个空列表:

>>> vin = vininfo.Vin("1NKZXPEX4GJ109010")
>>> vin.details.transmission = []
>>> vin.details.annotate()
OrderedDict([('Body', 'E'), ('Engine', 'Z'), ('Model', 'X'), ('Plant', 'J'), ('Serial', '109010'), ('Transmission', '')])

【讨论】:

  • 这样做我会从正确的数据中丢失“.transmission”中的数据。问题是我似乎无法“检查”“.transmission”是否有数据。如果它有数据一切正常,如果没有,那么它会在该 attr 上使用的任何方法上爆炸。甚至hasattr()也失败了。我能够修复该软件包的源代码,但这不是最佳选择,因此决定放弃使用它
猜你喜欢
  • 2010-10-27
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2020-10-16
  • 2013-08-08
  • 1970-01-01
相关资源
最近更新 更多