ValueError:不允许字段标题的可变默认 <class 'dict'>:使用 default_factory

rob*_*aga 5 python python-3.x python-dataclasses

我正在尝试使用新的 python 功能(数据类)。我正在尝试初始化变量,但出现错误:

raise ValueError(f'mutable default {type(f.default)} for field '
ValueError: mutable default <class 'dict'> for field headers is not allowed: use default_factory
Run Code Online (Sandbox Code Playgroud)

我的代码:

@dataclass
class Application():
    __config = ConfigParser()
    __config.read('mydb.ini')
    __host: str = __config.get('db','dbhost')
    __user: str = __config.get('db','dbuser')
    __password: str = __config.get('db','dbpw')
    __database: str = __config.get('db','database')
    url: str = "https://xxxx.domain.com/"
    headers: str = {'X-ApiKeys':'accessKey=xxxxxxx;secretKey=xxxxx','Content-Type': 'application/json'}



def main(self):
    print(self.__host,self.__user,self.__password, self.__database)
   


app = Application()
if __name__=="__main__":
    app.main()
Run Code Online (Sandbox Code Playgroud)

初始化字典的正确方法是什么?

小智 10

数据类有一些用于定义复杂字段的有用的东西。您需要的称为fielddefault_factory这个有一个需要接收可调用的参数,并且有lambda可以解决的地方。因此,使用上面的代码,可以工作的代码如下所示(只需部分字典):

from dataclasses import field
from typing import Dict

@dataclass
class Application():
    ...
    headers: Dict[str, str] = field(
        default_factory=lambda: {'X-ApiKeys':'accessKey=xxxxxxx;secretKey=xxxxx','Content-Type': 'application/json'}
    )
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢...它看起来比应该的更复杂... (4认同)