问题标签 [python-dataclasses]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2658 浏览

python - 如何使用元组和字典解包但没有额外的方法制作 attrs 类

我刚开始使用attrs非常漂亮的python模块(或者类似地我们可以使用Python 3.7 DataClasses)。我有一个常见的使用模式是让类成为参数值的容器。我喜欢分配参数时的标签,以及更简洁的属性样式引用值,但我也喜欢在将值存储在有序 dict 之类的东西中时有一些很好的特性:

  1. *像 atuple或 a一样解包list以输入函数参数
  2. **当关键字传递是必要或可取的时解包。

我可以通过在类中添加三个方法来实现这一切

然后我可以使用这样的类:

这里的动机是数据类提供方便和清晰。但是,我不使用数据类来编写我要编写的模块是有原因的。希望函数调用应该接受简单的参数,而不是复杂的数据类。

上面的代码很好,但我想知道我是否遗漏了一些可以让我完全跳过编写函数的东西,因为模式很清楚。属性按我希望它们解包的顺序添加,并且可以根据关键字参数的属性名称读取为键值对。

也许这是这样的:

但我不确定是否有attrs我没有找到的东西本身可以做到这一点。另外,我不确定如何在添加属性时保持它们的顺序并将其转换为 keys 方法。

0 投票
4 回答
1766 浏览

python - 禁止在类外部使用默认构造函数

考虑以下数据类。我想防止使用__init__方法直接创建对象。

例如,我想强制使用我定义的其他构造函数,如果直接将对象创建为c = C(..).

到目前为止,我已经尝试过如下。

with init=Falsein fieldI 防止a成为生成的参数__init__,因此这部分解决了c = C(1)引发异常的问题。
另外,我不喜欢它作为解决方案。

有没有直接的方法来禁止从类外部调用init方法?

0 投票
1 回答
612 浏览

python - New annotations break inspection of dataclasses

With PEP 563, from __future__ import annotations changes type annotations so that they are evaluated lazily, which provides a bunch of benefits like forward references.

However, this seems to play badly with other features, like dataclasses. For example, I have some code that inspects the type parameters of a class's __init__ method. (The real use case is to provide a default serializer for the class, but that is not important here.)

In Python 3.6 and 3.7, this does what is expected; it prints {'foo': <class '__main__.Foo'>, 'return': <class 'NoneType'>}.

However, if in Python 3.7, I add from __future__ import annotations, then this fails with an error:

I think I understand why this is happening. The __init__ method is defined in dataclasses which does not have the Foo object in its environment, and the Foo annotation is being passed to dataclass and attached to __init__ as the string "Foo" rather than as the original object Foo, but get_type_hints for the new annotations only does a name lookup in the module where __init__ is defined not where the annotation is defined.

I feel like I must be doing something wrong. I am surprised that these two new features play so poorly together. Is there a proper way to inspect the type hints of of an __init__ method so that it works on dataclasses like it does on normal classes?

0 投票
1 回答
28122 浏览

python - 为什么 `dataclasses.asdict(obj)` > 10x 比 `obj.__dict__()` 慢

我正在使用 Python 3.6 和来自ericvsmithdataclasses的backport 包。

似乎 calldataclasses.asdict(my_dataclass)比 call 慢 10 倍my_dataclass.__dict__

这是预期的行为吗?在什么情况下我应该使用dataclasses.asdict(obj)而不是obj.__dict__


编辑:使用__dict__.copy()并没有太大的区别:

0 投票
3 回答
30067 浏览

python - 如何在不使它们不可变的情况下使 python 数据类可散列?

假设我在 python3 中有一个数据类。我希望能够对这些对象进行散列和排序。我不希望这些是不可变的。

我只希望他们在 id 上排序/散列。

我在文档中看到我可以实现 _ hash _ 以及所有这些,但我想让 datacalsses 为我完成这项工作,因为它们旨在处理这个问题。

0 投票
2 回答
11023 浏览

python - 将字段动态添加到数据类对象

我正在编写一个库来访问 REST API。它返回带有用户对象的 json。我将其转换为 dict,然后将其转换为数据类对象。问题是并非所有字段都是固定的。我想动态添加其他字段(未在我的数据类中指定)。我可以简单地为我的对象分配值,但它们不会出现在对象表示中,并且dataclasses.asdict函数不会将它们添加到结果字典中:

0 投票
2 回答
5536 浏览

python - 使用仅在运行时已知的字段名称更新数据类中的字段

我想更新数据类中的字段,但我只在运行时知道字段名称,而不是在开发期间。

我需要类似的东西

但这最终导致“TypeError:'模板'对象不支持项目分配”

0 投票
1 回答
704 浏览

python - Python dataclasses_json:我可以存储对一个对象的多个引用吗?

我想使用@dataclass_json装饰器来存储我的@dataclass实例。

而且我想在实例中对一个对象有很多引用。我想保存这个引用结构(这样我就可以修改一个设置对象,并且修改将应用于许多使用这些设置的对象)。

当数据类对象位于内存中时,它可以很容易地完成,但是当我尝试将它存储在 JSON 中时,它会保存实例的副本而不是它的引用。我能以某种方式处理它吗?

PS这是我的代码示例:

0 投票
1 回答
4823 浏览

python - 如何使用数据类生成字段值?

我有以下课程:

如何将此类重写为数据类

具体来说,该id字段应该如何声明?它有一个生成的值,而不是创建实例的代码将提供的字段。

0 投票
1 回答
977 浏览

python - 数据类:NameError:未定义名称“WORD_TYPE”

我尝试使用 SO 问题示例

我有

我的 Python 版本

WORD_TYPE 到底是什么?