Dataclasses - AttributeError: type object 'Arguments' has no attribute 'column_names'

Dataclasses - AttributeError: type object 'Arguments' has no attribute 'column_names'

我正在尝试使用数据类来创建可在函数中使用的字符串列表。尝试正常访问信息时出现属性错误,就像 my_int: Optional[int] = field(default=1000).

例如:

from typing import Optional, List
from dataclasses import dataclass, field

@dataclass
class Arguments:
    """
    Configuration for data loader.
    """
    
    column_names: Optional[list[str]] = field(
        default_factory= lambda:['copies', 'path', 'repo_name', 'size', 'license', 'hash', 'line_mean', 'line_max', 'alpha_frac', 'autogenerated']
    )

def build_dl(args: Arguments):
    load_train_data = args.column_names
    return load_train_data

build_dl(Arguments)

错误: AttributeError: 类型对象 'Arguments' 没有属性 'column_names'

我正在尝试让 args.column_names 成为 ['copies', 'path', 'repo_name', 'size', 'license', 'hash', 'line_mean', 'line_max', 'alpha_frac', 'autogenerated']

我以前没有使用过数据类。任何帮助将不胜感激。

谢谢。

您似乎在尝试将 column_names 用作 class 变量,而不是数据 class 字段。也就是说,在您上面的情况下,您需要首先实例化 Arguments 的实例,例如 Arguments(column_names=...) 才能访问 column_names 属性。

所以澄清一下,在您的情况下,最快和最简单的解决方法是像这样更新调用:

build_dl(Arguments())

您可以用来解决此问题的另一种方法是使用文档中提到的 class variablesdataclasses 完全将其排除在外。另一种选择是完全删除像 list[str] 这样的注释,这也会达到相同的结果。

在下文中,我还将 args 的注释更新为 Type[Arguments],以表明我们正在传递实际类型(例如 Arguments)而不是实例同类型

from typing import Type, ClassVar
from dataclasses import dataclass


@dataclass
class Arguments:
    """
    Configuration for data loader.
    """

    column_names: ClassVar[list[str]] = [
        'copies', 'path', 'repo_name', 'size', 'license', 'hash', 'line_mean',
        'line_max', 'alpha_frac', 'autogenerated'
    ]


def build_dl(args: Type[Arguments]):
    load_train_data = args.column_names
    return load_train_data


build_dl(Arguments)