使用数据类读取文本文件,将属性设置为datetime对象



我试图强迫自己养成使用数据类的习惯。我正在阅读一个文本文件的数据行,其中两列包含一个日期。当我将文件读入类时,为什么日期没有被转换为datetime对象?

import datetime
from dataclasses import dataclass
@dataclass
class AC07:
NAME: str
MADE_FROM_DATE: datetime.datetime
MADE_UPTO_DATE: datetime.datetime

counter = 0
deck = []
with open(filename, encoding="latin-1") as file:
for line in file:
args = line.strip().split("|")[1:]  # not interested in first column
data = AC07(*args)
deck.append(data)
counter += 1
if counter == 10:
break

print (type(deck[0].MADE_FROM_DATE))
<class 'str'>
# Expected behavior <class datetime.datetime> 

如果我错了,请有人纠正我,但我相信数据类不强制类型。datetime。除了两个实现细节之外,示例中的Datetime(几乎)只是一个注释。检查文档。具体地说,

dataclass()装饰器检查类以查找字段。字段被定义为具有类型注释的类变量。除了下面描述的两个例外,dataclass()中没有检查变量注释中指定的类型。

这两个异常与强制数据类型无关:

类变量dataclass()实际检查字段类型的两个地方之一是确定字段是否为PEP 526中定义的类变量。它通过检查字段的类型是否为typing.ClassVar来做到这一点。如果一个字段是ClassVar,它将被排除在作为字段的考虑之外,并被数据类机制忽略。这样的ClassVar伪字段不会被模块级fields()函数返回。

Init-only变量dataclass()检查类型注释的另一个地方是确定字段是否为仅初始化变量。它通过查看字段的类型是否为dataclass . initvar类型来实现这一点。如果一个字段是InitVar,它被认为是一个伪字段,称为仅初始化字段。因为它不是一个真字段,所以它不会被模块级fields()函数返回。仅初始化字段作为参数添加到生成的__init__()方法中,并传递给可选的__post_init__()方法。它们不被数据类使用。

现在我用@vasco-ludovico发布的答案更好地理解了它,为了解决我的问题,我使用了下面的代码:

with open(filename, encoding="latin-1") as file:
for line in file:
args = line.strip().split("|")[1:]  # not interested in first column
data = AC07(*args)
data.MADE_FROM_DATE = datetime.datetime.strptime(data.MADE_FROM_DATE, "%d/%m/%Y")
deck.append(data)
counter += 1
if counter == 10:
break

最新更新