Есть ли способ узнать, если у объекта есть не повторяемый объект NoneType внутри - PullRequest
1 голос
/ 18 февраля 2020

Поэтому я использую vininfo для заполнения информации о некоторых единицах из внешней БД, используя только их VIN, и для работы с этими данными я конвертирую ее в dict, используя annotate() или annotate().items(), но сценарий разбивается на

TypeError: cannot unpack non-iterable NoneType object

Попытка с использованием hasattr(obj, 'attr'), но он взрывается там с той же ошибкой. Невозможно выполнить итерацию с for..in, поскольку объект не является итерируемым TypeError: 'NoneType' object is not iterable.

Я пытался использовать версию CLI с тем же VIN, и он выдает ту же ошибку 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

1 Ответ

0 голосов
/ 18 февраля 2020

Вы можете принудительно передать в пустой список:

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