标签: python-dataclasses

在namedtuple中输入提示

请考虑以下代码:

from collections import namedtuple
point = namedtuple("Point", ("x:int", "y:int"))
Run Code Online (Sandbox Code Playgroud)

上面的代码只是一种证明我想要实现的目标的方法.我想namedtuple用类型提示.

你知道如何达到预期效果的优雅方式吗?

python type-hinting namedtuple python-3.x python-dataclasses

100
推荐指数
3
解决办法
2万
查看次数

什么是数据类,它们与普通类有什么不同?

使用PEP 557,数据类被引入到python标准库中.

他们使用@dataclass装饰器,他们应该是"默认的可变的命名元组",但我不确定我理解这实际意味着什么,以及它们与普通类的区别.

究竟什么是python数据类以及何时最好使用它们?

python class python-3.7 python-dataclasses

82
推荐指数
5
解决办法
3万
查看次数

如何将Python数据类转换为字符串文字字典?

给定如下数据类:

class MessageHeader(BaseModel):
    message_id: uuid.UUID

    def dict(self, **kwargs):
        return json.loads(self.json())
Run Code Online (Sandbox Code Playgroud)

dict当我调用时,我想获得一个字符串文字的字典。MessageHeader 字典的期望结果如下所示:

{'message_id': '383b0bfc-743e-4738-8361-27e6a0753b5a'}
Run Code Online (Sandbox Code Playgroud)

我想避免使用第三方库,例如pydantic& 我不想使用json.loads(self.json()),因为有额外的往返

有没有更好的方法将数据类转换为带有上面字符串文字的字典?

python json dictionary python-dataclasses

57
推荐指数
3
解决办法
8万
查看次数

具有可选属性的 python 数据类

如何制作数据类的可选属性?

from dataclasses import dataclass

@dataclass
class CampingEquipment:
    knife: bool
    fork: bool
    missing_flask_size: # what to write here?
    
kennys_stuff = {
    'knife': True,
    'fork': True
}

print(CampingEquipment(**kennys_stuff))
Run Code Online (Sandbox Code Playgroud)

我尝试过field(init=False),但它给了我:

TypeError: CampingEquipment.__init__() missing 1 required positional argument: 'missing_flask_size'
Run Code Online (Sandbox Code Playgroud)

我所说的“可选”是指__dict__可能包含或不包含“missing_flask_size”键。如果我设置默认值,那么密钥将在那里,但在某些情况下不应该在那里。我想检查它的类型是否存在。

我尝试将 移动field(init=False)到类型位置(冒号之后),这样我就可以更明确地说明我想要的可选内容是键而不是值。

所以我希望这个测试能够通过:

with pytest.raises(AttributeError):
    ce = CampingEquipment(**kennys_stuff)
    print(ce.missing_flask_size)
Run Code Online (Sandbox Code Playgroud)

python python-dataclasses

43
推荐指数
2
解决办法
6万
查看次数

迭代数据类键和值的更好方法是什么?

我有两个数据类,Route并且Factors. Route包含一个值和三个副本Factors

Route不知道Factors包含多少个变量。我想获取这些变量的名称,然后获取Factors.

这是我目前拥有的:

@dataclass
class Factors:
    do: bool  # does it do the route
    hub: int # how many of the locations are hubs

    def __init__(self, do_init):
        self.do = do_init
        self.hub = 0 # will add later 

    def __str__(self):
        return "%s" % self.do


@dataclass
class Route:
    route: tuple
    skyteam: Factors
    star: Factors
    oneworld: Factors

    def __init__(self, route):
        self.route = route.get('route')
        # this could probably be done with …
Run Code Online (Sandbox Code Playgroud)

python python-dataclasses

40
推荐指数
4
解决办法
5万
查看次数

来自dict的Python数据类

3.7中的标准库可以递归地将数据类转换为dict(来自docs的示例):

from dataclasses import dataclass, asdict
from typing import List

@dataclass
class Point:
     x: int
     y: int

@dataclass
class C:
     mylist: List[Point]

p = Point(10, 20)
assert asdict(p) == {'x': 10, 'y': 20}

c = C([Point(0, 0), Point(10, 4)])
tmp = {'mylist': [{'x': 0, 'y': 0}, {'x': 10, 'y': 4}]}
assert asdict(c) == tmp
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法,在存在嵌套时将字典转回数据类.喜欢的东西,C(**tmp)只有工作,如果数据类的字段是简单类型,而不是自己的数据类.我熟悉jsonpickle,但它带有一个突出的安全警告.

python python-3.x python-dataclasses

38
推荐指数
7
解决办法
1万
查看次数

Python 3.7数据类中的类继承

我目前正在尝试使用Python 3.7中引入的新数据类结构.我目前坚持尝试做一些父类的继承.看起来参数的顺序是由我当前的方法拙劣的,这样子类中的bool参数在其他参数之前传递.这导致类型错误.

from dataclasses import dataclass

@dataclass
class Parent:
    name: str
    age: int
    ugly: bool = False

    def print_name(self):
        print(self.name)

    def print_age(self):
        print(self.age)

    def print_id(self):
        print(f'The Name is {self.name} and {self.name} is {self.age} year old')

@dataclass
class Child(Parent):
    school: str
    ugly: bool = True


jack = Parent('jack snr', 32, ugly=True)
jack_son = Child('jack jnr', 12, school = 'havard', ugly=True)

jack.print_id()
jack_son.print_id()
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我得到了这个TypeError:

TypeError: non-default argument 'school' follows default argument
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

python python-3.x python-3.7 python-dataclasses

35
推荐指数
6
解决办法
7684
查看次数

从 json 初始化 pydantic 数据类

我正在将dataclasses项目中现有的转换为pydantic-dataclasses,我使用这些dataclasses来表示我需要编码和解析 json 的模型。

这是我当前方法的一个示例,该方法对于我的用例来说不够好,我有一个类A,我想将其转换为字典(稍后转换为 json)并从该字典中读取。但我能找到的将 json 解析回模型的唯一方法给了我底层BaseModel而不是dataclass.

请注意,我使用该asdict函数将 a 转换dataclass为 a dict,因为它是用来pydantic_encoder将 a 转换dataclass为 json 的,并使用pydantic_encoder文档建议的将 a 转换pydantic-dataclass为 json: https: //pydantic-docs.helpmanual.io/usage /数据类/

from dataclasses import asdict
from pydantic.dataclasses import dataclass
from pydantic import BaseModel

@dataclass
class A:
    x: str

a = A("string")
a_dict = asdict(a)
parsed_a = A.__pydantic_model__.parse_obj(a_dict)

print(f"type of a: {type(a)}")
print(f"type of parsed_a: …
Run Code Online (Sandbox Code Playgroud)

python python-dataclasses pydantic

34
推荐指数
4
解决办法
6万
查看次数

“pydantic\validators.py”:找不到 <class 'pandas.core.frame.DataFrame'> 的验证器

以下 pandas 的 DataFrame 未经过 pydantic 验证。这要怎么处理呢?

from pydantic.dataclasses import dataclass

@dataclass
class DataFrames:
    dataframe1: pd.DataFrame = None
    dataframe2: pd.DataFrame = None
Run Code Online (Sandbox Code Playgroud)

这会引发以下错误:

File "pydantic\validators.py", line 715, in find_validators

RuntimeError: no validator found for <class 'pandas.core.frame.DataFrame'>, see `arbitrary_types_allowed` in Config
Run Code Online (Sandbox Code Playgroud)

validation customvalidator pandas python-dataclasses pydantic

32
推荐指数
3
解决办法
5万
查看次数

Python 3.7:dataclass不会为`eq = False`引发`TypeError`

dataclasses在Python 3.7中尝试新的

dataclass装饰可以传递的参数来控制被添加到类dunder功能.

出于某种原因,装饰似乎并没有提高TypeErroreq=False说法.

根据文档:

eq: If true (the default), an __eq__ method will be generated. 
This method compares the class as if it were a tuple of its fields, in order. 
Both instances in the comparison must be of the identical type
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,如果我通过eq = False,__eq__则不会添加函数,并且TypeError在比较同一类的两个实例时应抛出a .相反,该eq参数似乎没有任何效果.

@dataclass(eq = False)
class Number:
    val: int

a = Number(1)
b = Number(2)
c = Number(1)

a …
Run Code Online (Sandbox Code Playgroud)

python python-3.7 python-dataclasses

25
推荐指数
2
解决办法
1275
查看次数