请考虑以下代码:
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
使用PEP 557,数据类被引入到python标准库中.
他们使用@dataclass装饰器,他们应该是"默认的可变的命名元组",但我不确定我理解这实际意味着什么,以及它们与普通类的区别.
究竟什么是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()),因为有额外的往返
有没有更好的方法将数据类转换为带有上面字符串文字的字典?
如何制作数据类的可选属性?
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) 我有两个数据类,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) 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 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)
我该如何解决?
我正在将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) 以下 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
我dataclasses在Python 3.7中尝试新的
的dataclass装饰可以传递的参数来控制被添加到类dunder功能.
出于某种原因,装饰似乎并没有提高TypeError的eq=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 ×9
python-3.7 ×3
python-3.x ×3
pydantic ×2
class ×1
dictionary ×1
json ×1
namedtuple ×1
pandas ×1
type-hinting ×1
validation ×1