【问题标题】:Why `dataclasses.make_dataclass` does not cast `bytes` to `bool`为什么`dataclasses.make_dataclass`不会将`bytes`转换为`bool`
【发布时间】:2019-12-27 21:47:53
【问题描述】:

我有以下问题。我尝试使用make_dataclass 函数从SQL 查询结果创建dataclass。假设我的记录是这样的:

import dataclasses

record = {
    'name': 'asdasd',
    'age': None,
    'is_active': bytes(1),
    'is_admin': bytes(0),
    'amount': 1
}


def make_field(k, v):
    t = type(v)
    if isinstance(v, bytes):
        t = bool
    return k, t


Record = dataclasses.make_dataclass('Record', [make_field(k, v) for k, v in record.items()])

然后如果 value 是一个字节,我想用 bool 代替。但结果如下:

Record(name='asdasd', age=None, is_active=b'\x00', is_admin=b'', amount=1)

我有两个问题:

  1. 为什么它仍然是字节?因为 bool 也是字节?
  2. 有没有更好的方法来代替r.is_active = bool(r.is_active)

谢谢

【问题讨论】:

    标签: python python-3.x python-dataclasses


    【解决方案1】:

    它们仍然是字节,因为您说该字段的类型是bool,但这并不意味着它将被强制转换为该类型。将错误的类型赋予数据类或普通变量是完全合法的,并且数据不会自动转换为带注释的类型:

    var: int = "Wrong type"  # Causes a warning, not an error
    print(var, type(var))  # Prints "Wrong type <class 'str'>"
    

    类型提示纯粹是出于静态类型检查的原因,除非您修改 IDE 设置以将类型提示警告视为实际错误,否则实际上不会强制执行。即使您确实将它们视为错误,它也不会为您转换数据,而且在这种确切情况下甚至可能无法捕捉到错误。


    至于如何处理,您将需要手动处理。您可以创建一个进行转换的自定义“构造函数”。不管你怎么做,你都必须在某处写一些类似r.is_active = bool(r.is_active)的东西。

    【讨论】:

      猜你喜欢
      • 2011-06-25
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      相关资源
      最近更新 更多