Python loguru 中的文字和列表错误:+ 不支持的操作数类型:'NoneType' 和 'list'
Python error with literals and lists in loguru: unsupported operand type(s) for +: 'NoneType' and 'list'
正在使用 loguru 将列表写回配置文件,但收到了可怕的 unsupported operand type(s) for +: 'NoneType' and 'list'
错误。我知道错误来自于尝试组合文字和列表。我试图通过使用变量来表示文字来分解该行,但这只会产生相同的错误。
有问题行的代码块:
def update_config(config: dict):
"""
Update exisitng configuration file.
Parameters
----------
config: dict
Configuraiton to be written into config file.
"""
config["ids_to_retry"] = list(set(config["ids_to_retry"] + FAILED_IDS))
with open("config.yaml", "w") as yaml_file:
yaml.dump(config, yaml_file, default_flow_style=False)
logger.info("Updated last read message_id to config file")
完整错误输出:
Traceback (most recent call last):
File "/telegram-downloader-quackified/media_downloader.py", line 359, in <module>
main()
File "/telegram-downloader-quackified/media_downloader.py", line 343, in main
updated_config = asyncio.get_event_loop().run_until_complete(
File "/miniconda3/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
return future.result()
File "/telegram-downloader-quackified/media_downloader.py", line 324, in begin_import
update_config(config)
File "/telegram-downloader-quackified/media_downloader.py", line 35, in update_config
config["ids_to_retry"] = list(set(config["ids_to_retry"] + FAILED_IDS))
我知道短语 list(set(config["ids_to_retry"] + FAILED_IDS))
中需要更改某些内容,但我不确定是什么。
提供更多信息:
FAILED_IDS是脚本遇到异常,无法顺利完成下载时生成的列表。发生这种情况时,消息 ID 会像 FAILED_IDS.append(message.message_id)
一样存储在内存中。然后用如下语句写入配置文件:
if FAILED_IDS:
logger.info(
"Downloading of %d files failed. "
"Failed message ids are added to config file.\n",
len(set(FAILED_IDS)),
)
update_config(updated_config)
它的原始值为:
FAILED_IDS: list = []
其中“ids_to_retry”或多或少只是配置文件中使用的标签。它只是一个文字字符串,并且是非类型。最终结果是将两者写入配置文件类似于以下内容:
ids_to_retry:
- 26125
- 2063
- 2065
- 2080
- 2081
- 22052
- 21029
- 553
- 554
- 555
- 2102
- 22074
我希望这能阐明我们正在使用的变量的性质。
失败的原因是 config["ids_to_retry"] = None
并且您正在尝试将 Nonetype 扩展到列表。你可以使用像
这样的东西
config["ids_to_retry"] = list(set(config["ids_to_retry"] + FAILED_IDS)) if config["ids_to_retry"] else FAILED_IDS
因此,如果 config["ids_to_retry"]
是 None
,则需要 config["ids_to_retry"] = FAILED_IDS
,而无需尝试扩展它。
假定 FAILED_IDS
是一个列表,如果不是,您可以将其类型转换为列表。
正在使用 loguru 将列表写回配置文件,但收到了可怕的 unsupported operand type(s) for +: 'NoneType' and 'list'
错误。我知道错误来自于尝试组合文字和列表。我试图通过使用变量来表示文字来分解该行,但这只会产生相同的错误。
有问题行的代码块:
def update_config(config: dict):
"""
Update exisitng configuration file.
Parameters
----------
config: dict
Configuraiton to be written into config file.
"""
config["ids_to_retry"] = list(set(config["ids_to_retry"] + FAILED_IDS))
with open("config.yaml", "w") as yaml_file:
yaml.dump(config, yaml_file, default_flow_style=False)
logger.info("Updated last read message_id to config file")
完整错误输出:
Traceback (most recent call last):
File "/telegram-downloader-quackified/media_downloader.py", line 359, in <module>
main()
File "/telegram-downloader-quackified/media_downloader.py", line 343, in main
updated_config = asyncio.get_event_loop().run_until_complete(
File "/miniconda3/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
return future.result()
File "/telegram-downloader-quackified/media_downloader.py", line 324, in begin_import
update_config(config)
File "/telegram-downloader-quackified/media_downloader.py", line 35, in update_config
config["ids_to_retry"] = list(set(config["ids_to_retry"] + FAILED_IDS))
我知道短语 list(set(config["ids_to_retry"] + FAILED_IDS))
中需要更改某些内容,但我不确定是什么。
提供更多信息:
FAILED_IDS是脚本遇到异常,无法顺利完成下载时生成的列表。发生这种情况时,消息 ID 会像 FAILED_IDS.append(message.message_id)
一样存储在内存中。然后用如下语句写入配置文件:
if FAILED_IDS:
logger.info(
"Downloading of %d files failed. "
"Failed message ids are added to config file.\n",
len(set(FAILED_IDS)),
)
update_config(updated_config)
它的原始值为:
FAILED_IDS: list = []
其中“ids_to_retry”或多或少只是配置文件中使用的标签。它只是一个文字字符串,并且是非类型。最终结果是将两者写入配置文件类似于以下内容:
ids_to_retry:
- 26125
- 2063
- 2065
- 2080
- 2081
- 22052
- 21029
- 553
- 554
- 555
- 2102
- 22074
我希望这能阐明我们正在使用的变量的性质。
失败的原因是 config["ids_to_retry"] = None
并且您正在尝试将 Nonetype 扩展到列表。你可以使用像
config["ids_to_retry"] = list(set(config["ids_to_retry"] + FAILED_IDS)) if config["ids_to_retry"] else FAILED_IDS
因此,如果 config["ids_to_retry"]
是 None
,则需要 config["ids_to_retry"] = FAILED_IDS
,而无需尝试扩展它。
假定 FAILED_IDS
是一个列表,如果不是,您可以将其类型转换为列表。