在python数据类注释上进行一般性迭代

2024-09-28 05:25:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个超级数据类(设置)和多个继承超级数据类(FSettings、BSettings)设置的子级

如果适用,我如何将“参数”字典以设置它们的方式传递给子数据类

from dataclasses import dataclass

@dataclass()
class Settings:
    verbose: bool 
    detailed: bool 



@dataclass()
class FSettings(Settings):
    vals: list 
    def __init__(self, args):
        for arg in args:
            if arg in list(self.__annotations__):
                self.__setattr__(arg, args[arg])
        
if __name__ == '__main__':
    args = {'vals': ["a", "b"], 'verbose': True, 'detailed':False}
    s = FSettings(args)
    print(s)

如果我打印list(self.__annotations__),它会显示['vals'],忽略verbosedetailed


Tags: 数据inselfverboseifsettingsargargs
2条回答

(试了一个小时后我自己的答案)

这似乎可行,但您必须将默认值设置为“无”,因为FSettings值在设置值之后启动。如果没有默认值,hasattr将返回false

init也可以移动到父类,因为它是泛型的。但是,子级中需要super().__init__(),否则父级值填充错误(错误不一致,不完全确定原因)

from dataclasses import dataclass

@dataclass() 
class Settings:
    verbose: bool = None
    detailed: bool = None
    def __init__(self, args):
        for arg in args:
            if hasattr(self, arg):
                self.__setattr__(arg, args[arg])
            else:
                print(f"Settings class could not locate {arg} as a setting. Skipping...")

@dataclass() 
class FSettings(Settings):
    vals: list = None


    def __init__(self, args):
        super().__init__(args)


if __name__ == '__main__':
    args = {'vals': ["a", "b"], 'verbose': True, 'detailed':False}
    s = FSettings(args)
    print(s)
from dataclasses import dataclass
from typing import Optional


@dataclass
class Settings:
    verbose: Optional[bool] = None
    detailed: Optional[bool] = None

    def __post_init__(self) -> None:

        args = []
        if self.verbose is None:
            args.append('verbose')

        if self.detailed is None:
            args.append('detailed')

        if args:
            s = f"Settings class could not locate {args} as a setting."
            s += " Skipping..."
            print(s)


@dataclass
class FSettings(Settings):
    vals: Optional[list] = None


args = {'vals': ["a", "b"], 'verbose': True, 'detailed': False}
f_settings = FSettings(**args)

args = {'vals': ["a", "b"]}
f_settings = FSettings(**args)
# Settings class could not locate ['verbose', 'detailed'] as a setting. Skipping..

相关问题 更多 >

    热门问题