问题标签 [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.
python - 如何使用元组和字典解包但没有额外的方法制作 attrs 类
我刚开始使用attrs
非常漂亮的python模块(或者类似地我们可以使用Python 3.7 DataClasses)。我有一个常见的使用模式是让类成为参数值的容器。我喜欢分配参数时的标签,以及更简洁的属性样式引用值,但我也喜欢在将值存储在有序 dict 之类的东西中时有一些很好的特性:
*
像 atuple
或 a一样解包list
以输入函数参数**
当关键字传递是必要或可取的时解包。
我可以通过在类中添加三个方法来实现这一切
然后我可以使用这样的类:
这里的动机是数据类提供方便和清晰。但是,我不使用数据类来编写我要编写的模块是有原因的。希望函数调用应该接受简单的参数,而不是复杂的数据类。
上面的代码很好,但我想知道我是否遗漏了一些可以让我完全跳过编写函数的东西,因为模式很清楚。属性按我希望它们解包的顺序添加,并且可以根据关键字参数的属性名称读取为键值对。
也许这是这样的:
但我不确定是否有attrs
我没有找到的东西本身可以做到这一点。另外,我不确定如何在添加属性时保持它们的顺序并将其转换为 keys 方法。
python - 禁止在类外部使用默认构造函数
考虑以下数据类。我想防止使用__init__
方法直接创建对象。
例如,我想强制使用我定义的其他构造函数,如果直接将对象创建为c = C(..)
.
到目前为止,我已经尝试过如下。
with init=False
in field
I 防止a
成为生成的参数__init__
,因此这部分解决了c = C(1)
引发异常的问题。
另外,我不喜欢它作为解决方案。
有没有直接的方法来禁止从类外部调用init方法?
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?
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()
并没有太大的区别:
python - 如何在不使它们不可变的情况下使 python 数据类可散列?
假设我在 python3 中有一个数据类。我希望能够对这些对象进行散列和排序。我不希望这些是不可变的。
我只希望他们在 id 上排序/散列。
我在文档中看到我可以实现 _ hash _ 以及所有这些,但我想让 datacalsses 为我完成这项工作,因为它们旨在处理这个问题。
python - 将字段动态添加到数据类对象
我正在编写一个库来访问 REST API。它返回带有用户对象的 json。我将其转换为 dict,然后将其转换为数据类对象。问题是并非所有字段都是固定的。我想动态添加其他字段(未在我的数据类中指定)。我可以简单地为我的对象分配值,但它们不会出现在对象表示中,并且dataclasses.asdict
函数不会将它们添加到结果字典中:
python - 使用仅在运行时已知的字段名称更新数据类中的字段
我想更新数据类中的字段,但我只在运行时知道字段名称,而不是在开发期间。
我需要类似的东西
但这最终导致“TypeError:'模板'对象不支持项目分配”
python - Python dataclasses_json:我可以存储对一个对象的多个引用吗?
我想使用@dataclass_json
装饰器来存储我的@dataclass
实例。
而且我想在实例中对一个对象有很多引用。我想保存这个引用结构(这样我就可以修改一个设置对象,并且修改将应用于许多使用这些设置的对象)。
当数据类对象位于内存中时,它可以很容易地完成,但是当我尝试将它存储在 JSON 中时,它会保存实例的副本而不是它的引用。我能以某种方式处理它吗?
PS这是我的代码示例:
python - 数据类:NameError:未定义名称“WORD_TYPE”
我尝试使用 SO 问题示例
我有
我的 Python 版本
WORD_TYPE 到底是什么?