我有以下类型的对象列表:
@dataclass
class Feature:
name: str
active: bool
Run Code Online (Sandbox Code Playgroud)
我的清单是:
features = [Feature("name1",False), Feature("name2",False), Feature("name3",True)]
Run Code Online (Sandbox Code Playgroud)
我想取回包含所有功能的列表,但将其active属性切换为True. 我尝试map()这样使用:
active_features=list(map(lambda f: f.active=True,features))
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误expected parameter。如何才能实现这一目标?
请注意 ,我认为这是从示例中得出的,但我想我应该澄清一下。我想用一些简短的内联方法来做到这一点,而不需要按照一些答案的建议定义一个新的单独函数,但也许不能像这样完成?
此代码按预期工作:
from dataclasses import dataclass
@dataclass(slots=False, init=False)
class Test:
field: str = "default value"
print(Test()) # outputs "Test(field='default value')"
Run Code Online (Sandbox Code Playgroud)
但是,如果我更改slots为True,它会抛出 AttributeError:
AttributeError: 'Test' object has no attribute 'field'
Run Code Online (Sandbox Code Playgroud)
要解决此问题,我必须使用生成的__init__方法或显式初始化自定义方法中的所有字段__init__。这种行为背后的原因是什么?
我刚开始使用attrsPython 模块,它非常漂亮(或者类似地,我们可以使用 Python 3.7 DataClasses)。我有一个常见的使用模式是让类成为参数值的容器。我喜欢分配参数时的标签,以及更清晰的属性样式引用值,但我也喜欢在将值存储在有序 dict 之类的东西中时有几个很好的功能:
*像 atuple或 a一样解包list以输入函数参数** 当需要或需要传递关键字时解压缩。我可以通过在类中添加三个方法来实现这一切
@attr.s
class DataParameters:
A: float = attr.ib()
alpha: float = attr.ib()
c: float = attr.ib()
k: float = attr.ib()
M_s: float = attr.ib()
def keys(self):
return 'A', 'alpha', 'c', 'k', 'M_s'
def __getitem__(self, key):
return getattr(self, key)
def __iter__(self):
return (getattr(self, x) for x in self.keys())
Run Code Online (Sandbox Code Playgroud)
然后我可以使用这样的类:
params = DataParameters(1, 2, 3, 4, 5)
result1 = function1(100, 200, *params, 300) …Run Code Online (Sandbox Code Playgroud) 我正在尝试queue.PriorityQueue在 Python 3(.6) 中使用。
我想存储具有给定优先级的对象。但是如果两个对象具有相同的优先级,我也不介意PriorityQueue.get返回。换句话说,我的对象不能以整数进行比较,允许它们是没有意义的,我只关心优先级。
在Python 3.7 的文档中,有一个涉及dataclasses. 我引用:
如果数据元素不可比较,可以将数据包装在一个忽略数据项而只比较优先级数字的类中:
from dataclasses import dataclass, field
from typing import Any
@dataclass(order=True)
class PrioritizedItem:
priority: int
item: Any=field(compare=False)
Run Code Online (Sandbox Code Playgroud)
唉,我使用的是 Python 3.6。在这个版本的 Python 的文档中,没有关于使用PriorityQueue优先级的评论,也不关心在我的情况下不合逻辑的“对象值”。
有没有比__le__在我的自定义类上定义和其他比较方法更好的方法?我发现这个解决方案特别丑陋和违反直觉,但这可能是我。
Python 3.7引入了数据类来存储数据。我正在考虑采用这种新方法,该方法比命令更井井有条。
但是我有一个疑问。Python将键转换为dict上的哈希,这使得查找键和值的速度更快。数据类实现类似的东西吗?
哪一个更快?为什么?
如何检查dataclassPython中的类?
我发现可以检查__dataclass_fields__和__dataclass_params__属性的存在,但是我很想找到一种更优雅的方法。
我希望使用类似inspect.isclass函数的东西。例如inspect.isdataclass,也许像。
Python有这样的东西吗?
谢谢。
我如何声明一个数组(或至少是列表)@dataclass?类似于下面的内容:
from dataclasses import dataclass
@dataclass
class Test():
my_array: Array[ChildType]
Run Code Online (Sandbox Code Playgroud) python type-hinting python-3.x python-dataclasses python-typing
我正在创建一个带有字段的数据类,我希望只有几个可能的值。我在想这样的事情:
@dataclass
class Person:
name: str = field(default='Eric', choices=['Eric', 'John', 'Graham', 'Terry'])
Run Code Online (Sandbox Code Playgroud)
我知道一种解决方案是验证__post_init__方法中的参数,但是否有使用类似上述语法的更简洁的方法?
我正在尝试将 marshmallow-dataclass 与 marshmallow-oneofschema 结合起来,以处理提供给我并用于连接 java 和 python 应用程序的数据结构。
在 java 中,这个概念通常被称为“鉴别器”,它由不同的框架实现:Jackson (de-)serialization for polymorph list
我认为这应该是可能的,但现在我面临以下问题:
Traceback (most recent call last):
File "one_file_dataclass_oneofschema_example.py", line 69, in <module>
ContainerSchema.load(example)
File "/site-packages/marshmallow_dataclass/__init__.py", line 473, in load
all_loaded = super().load(data, many=many, **kwargs)
File "/site-packages/marshmallow/schema.py", line 722, in load
return self._do_load(
File "/site-packages/marshmallow/schema.py", line 856, in _do_load
result = self._deserialize(
File "/site-packages/marshmallow/schema.py", line 664, in _deserialize
value = self._call_and_store(
File "/site-packages/marshmallow/schema.py", line 493, in _call_and_store
value = getter_func(data)
File "/site-packages/marshmallow/schema.py", line 661, …Run Code Online (Sandbox Code Playgroud) python polymorphism discriminator marshmallow python-dataclasses
我们有这个类:
from dataclasses import dataclass, field
from datetime import datetime
from typing import List, Dict
@dataclass
class BoardStaff:
date: str = datetime.now()
fullname: str
address: str
## attributes to be excluded in __str__:
degree: str
rank: int = 10
badges: bool = False
cases_dict: Dict[str, str] = field(default_factory=dict)
cases_list: List[str] = field(default_factory=list)
Emp = BoardStaff('Jack London', address='Unknown', degree='MA')
Run Code Online (Sandbox Code Playgroud)
作为BoardStaff数据类,可以轻松print(Emp)地接收:
BoardStaff(fullname='Jack London', address='Unknown', degree='MA', rank=10, badges=False, cases={}, date=datetime.datetime(2021, 8, 10, 11, 36, 50, 693428)).
但是,我希望从表示中排除一些属性(即最后 5 …
python ×10
python-3.x ×3
python-3.7 ×2
attributes ×1
class ×1
dictionary ×1
field ×1
marshmallow ×1
polymorphism ×1
python-attrs ×1
slots ×1
type-hinting ×1