为什么被Hydra装饰器修饰的函数会返回None类型?
问题原因
你遇到的返回None是Hydra 1.x版本@hydra.main装饰器的固有设计:该版本的装饰器默认不会透传被修饰函数的返回值,无论你在函数内部return什么内容,装饰器外层最终都会返回None。去掉装饰器后函数直接执行,自然能正常返回你定义的结果。
适配你当前版本(hydra-core 1.1.1)的解决方案
方案1:改用Hydra Compose API获取配置(推荐)
不使用@hydra.main装饰器,改用显式的compose接口加载配置,就能正常调用函数拿到返回值,代码示例如下:
import hydra from omegaconf import DictConfig, OmegaConf import sys import random import os from hydra import compose, initialize input_data_path = "path/to/input/data" def get_number_from_sentences(cfg: DictConfig): n_sentences = cfg.n_sentences list_results = [] with open(input_data_path, 'r') as input_data_file: input_data = input_data_file.readlines() for i in range(0, len(input_data), n_sentences): result = 0 for sentence in input_data[i:i+n_sentences]: for word in sentence: result = result + random.randint(0, 100) result = result/(n_sentences*100) list_results.append(result) return list_results if __name__ == "__main__": # 显式加载配置 with initialize(version_base=None, config_path="conf"): cfg = compose(config_name="default") print(get_number_from_sentences(cfg))
方案2:用全局变量存储结果
如果你不想调整现有函数的结构,可以把结果存储到全局变量里再读取,示例如下:
import hydra from omegaconf import DictConfig, OmegaConf import sys import random import os input_data_path = "path/to/input/data" results = [] @hydra.main(config_path='conf', config_name='default') def get_number_from_sentences(cfg): global results n_sentences = cfg.n_sentences list_results = [] with open(input_data_path, 'r') as input_data_file: input_data = input_data_file.readlines() for i in range(0, len(input_data), n_sentences): result = 0 for sentence in input_data[i:i+n_sentences]: for word in sentence: result = result + random.randint(0, 100) result = result/(n_sentences*100) list_results.append(result) results = list_results get_number_from_sentences() print(results)
升级版本后的解决方案
如果可以升级hydra-core到1.2.0及以上版本,只需要给@hydra.main装饰器添加return_value=True参数即可直接获取返回值,示例如下:
@hydra.main(config_path='conf', config_name='default', return_value=True) def get_number_from_sentences(cfg): # 原有逻辑不变 return list_results print(get_number_from_sentences())
内容的提问来源于stack exchange,提问作者ricc_denni
相关产品推荐
相关产品推荐

