【问题标题】:kw_only and slots dataclass compatibility with older versions of Pythonkw_only 和 slot 数据类与旧版 Python 的兼容性
【发布时间】:2022-06-24 01:00:04
【问题描述】:

如何利用 Python 3.10 的 dataclass 中提供的新 kw_onlyslots 功能,同时还支持旧版本的 Python?

我想设置kw_only 的主要原因是为了让我可以将更多置信度值转到正确的字段,而slots 用于我可能会创建很多并且不想要不必要的对象dict 在幕后徘徊。

我最初想使用类似的东西:

from dataclasses import dataclass

# check if we're using Python >= 3.10
if 'kw_only' in dataclass.__kwdefaults__:
  _dataclass = dataclass

  # redefine this to ignore new options
  def dataclass(cls, *, kw_only=False, slots=False, **kwargs):
    if cls is None:
      return _dataclass(*kwargs)
    return _dataclass(cls)

但这导致 MyPy 抱怨函数被重新定义。

Python 3.8 是我个人关心支持的最古老的版本。

【问题讨论】:

    标签: python python-dataclasses


    【解决方案1】:

    我已经解决了这个问题:

    from dataclasses import dataclass
    
    # kw_only and slots were only introduced in Python 3.10
    KW_ONLY_DATACLASS = dict(kw_only=True) if 'kw_only' in dataclass.__kwdefaults__ else {}
    SLOTS_DATACLASS = dict(slots=True) if 'slots' in dataclass.__kwdefaults__ else {}
    
    # set kw_only=True on Python 3.10, ignoring if not supported
    @dataclass(**KW_ONLY_DATACLASS)
    class Foo:
        foo: int
    
    # and demo setting slots along with frozen
    @dataclass(frozen=True, **SLOTS_DATACLASS)
    class Bar:
        bar: int
    

    这个想法是定义一组可以扩展并填写适当参数的字典。

    我正在查看dataclass.__kwdefaults__ 以检查当前 Python 解释器支持哪些参数。似乎也可以使用dataclass.__code__.co_varnames,但没有这样做,因为这需要更深入地研究另一个层次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 2020-03-14
      • 2023-01-31
      • 1970-01-01
      相关资源
      最近更新 更多