标签: python-dataclasses

Python 3.7:使用数据类模块初始化对象?

这是我在python 3.6中的代码

class A(object)

    def __init__(self, a: str):
        self._int_a: int = int(a)  # desired composition

    def get_int_a(self) -> int:
        return self._int_a   
Run Code Online (Sandbox Code Playgroud)

我想重写这段代码python 3.7,我如何self._int_a: int = int(a)dataclasses模块初始化?

我知道我可以做类似的事情,但我不知道如何初始化_a: int = int(a)或类似。

from dataclasses import dataclass


@dataclass
class A(object):
    _a: int = int(a)  # i want to get initialized `int` object here

def get_int_a(self) -> int:
    return self._a
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的想法和建议。

python python-3.7 python-dataclasses

4
推荐指数
1
解决办法
4166
查看次数

数据类定义中的引用类类型

是否可以引用当前在类定义中定义的类?

from dataclasses import dataclass
from typing import List

@dataclass
class Branch:
    tree: List[Branch]
Run Code Online (Sandbox Code Playgroud)

错误:

NameError: name 'Branch' is not defined
Run Code Online (Sandbox Code Playgroud)

python typing python-dataclasses

4
推荐指数
1
解决办法
836
查看次数

有没有办法使用数据类,带有默认值的字段,带有 __slots__

我想放置__slots__一个带有默认字段的数据类。当我尝试这样做时,我收到此错误:

>>> @dataclass
... class C:
...     __slots__ = ('x', 'y', )
...     x: int
...     y: int = 1
...     
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: 'y' in __slots__ conflicts with class variable
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这一目标?

python python-dataclasses

4
推荐指数
1
解决办法
1047
查看次数

如何使未冻结的数据类实例可散列?

定义数据类时 frozen=False(默认行为),然后实例化这个类的一个对象时,有没有办法让这个对象可以散列?

为什么我需要这个?

在 Python 3.7 之前,我使用命名元组而不是数据类,我曾经使用 查找重复项set(),但我不能再使用它了。frozen=True由于其他原因,我不想在数据类上使用。

python python-dataclasses

4
推荐指数
1
解决办法
509
查看次数

如何在python中进化数据类?

我对使用 dataclass 很感兴趣,因为它的语法比 attr 短。但是,我找不到提供 API 来改进它的快捷方式,例如使用以下代码:

@dataclass
class AB(object):
    a: int = 1
    b: int = 2

AB().evolve(b=3)

result = AB(a=1, b=3)
Run Code Online (Sandbox Code Playgroud)

是否容易找到开箱即用的替代品?还是自己实施?

python python-dataclasses

4
推荐指数
1
解决办法
646
查看次数

dataclasses.asdict() 没有按预期工作

我正在使用dataclassand asdictfrom dataclasses,我发现这asdict在我引入继承时并不像我期望的那样工作。

dataclasses用来帮助我从类创建字典,以便我可以将它们传递到django.shortcuts.render.

from dataclasses import dataclass
from dataclasses import asdict

@dataclass
class Base:
    name: str

class Test(Base):
    def __init__(self, age, *args, **kwargs):
        self.age = age
        super(Test, self).__init__(*args, **kwargs)

test = Test(age=20, name="john doe")

print(asdict(test))
Run Code Online (Sandbox Code Playgroud)

我希望输出是

{"age": 20, "name": "john doe"}
Run Code Online (Sandbox Code Playgroud)

但我得到的只是来自基类的关键字值

{"name": "john doe"}
Run Code Online (Sandbox Code Playgroud)

python inheritance python-3.7 python-dataclasses

4
推荐指数
1
解决办法
3009
查看次数

如何修复 Python 中数据类的 TypeError?

我有一个具有 5 个属性的数据类。当我通过字典给出这些属性时,效果很好。但是当字典的属性多于类的属性时,类会给出 TypeError。我试图让当有额外的值时,类不会关心它们。我怎样才能做到这一点?

\n\n
from dataclasses import dataclass\n\n@dataclass\nclass Employee(object):\n    name: str\n    lastname: str\n    age: int or None\n    salary: int\n    department: str\n\n    def __new__(cls, name, lastname, age, salary, department):\n        return object.__new__(cls)\n\n    def __post_init__(self):\n        if type(self.age) == str:\n            self.age = int(self.age) or None\n\n    def __str__(self):\n        return f\'{self.name}, {self.lastname}, {self.age}\' \n\ndic = {"name":"abd\xc3\xbclmutallip", \n"lastname":"uzunkavaka\xc4\x9fac\xc4\xb1alt\xc4\xb1ndauzan\xc4\xb1ro\xc4\x9flu", \n"age":"24", "salary":2000, "department":"\xc4\xb0K", \n"city":"istanbul", "country":"tr", "adres":"yok", "phone":"0033333"}\n\na = Employee(**dic)\nprint(a)\n
Run Code Online (Sandbox Code Playgroud)\n\n

错误是:

\n\n
TypeError: __new__() got an unexpected keyword argument \'city\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望该类在这种情况下正常工作,没有任何错误。我不想将这些额外的属性添加到类中。

\n

python python-3.x python-dataclasses

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

如何将 kwargs 传递给 pydantic 验证器

我正在尝试编写pydanticvalidators,但我似乎无法理解如何使用kwargs文档中提到的参数。我想传递条件参数进行验证。这是一个玩具示例:

from pydantic import validator
import pydantic.dataclasses as pyd_dc


@pyd_dc.dataclass
class Point_t:
    x: int = 0
    y: int = 1

    @validator("y")
    def quadrant(cls, val, values, **kwargs):
        pt = x, y = values.get("x", None), val
        if x is None:
            raise ValueError(f"invalid point: {x}, {y}")

        signs = kwargs.get("signs", None)
        if signs is None:
            raise ValueError("'signs' parameter missing")

        if all(c * s >= 0 for c, s in zip(pt, signs) if s != 0):
            return val

        raise ValueError(f"{pt} …
Run Code Online (Sandbox Code Playgroud)

validation python-3.x python-dataclasses pydantic

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

漂亮的打印数据类更漂亮

Python数据类实例还包括一个字符串表示方法,但是当类具有多个字段和/或更长的字段值时,它的结果对于漂亮的打印目的来说并不足够。

基本上,我正在寻找一种方法来自定义默认的数据类字符串表示例程,或者寻找一种理解数据类并更漂亮地打印它们的漂亮打印机。

所以,这只是我想到的一个小自定义:在每个字段之后添加一个换行符,同时在第一个字段之后缩进行。

例如,代替

x = InventoryItem('foo', 23)
print(x) # =>
InventoryItem(name='foo', unit_price=23, quantity_on_hand=0)
Run Code Online (Sandbox Code Playgroud)

我想得到这样的字符串表示:

x = InventoryItem('foo', 23)
print(x) # =>
InventoryItem(
    name='foo',
    unit_price=23,
    quantity_on_hand=0
)
Run Code Online (Sandbox Code Playgroud)

或者类似的。也许漂亮的打印机可以变得更漂亮,例如对齐=分配字符或类似的东西。

当然,它也应该以递归方式工作,例如,也是数据类的字段应该缩进更多。

python pretty-print python-dataclasses

4
推荐指数
4
解决办法
1037
查看次数

超类的 __init__ 未使用数据类调用

我正在通过继承asyncio.Future一些自定义属性来创建一个作业类,并期望作业实例的功能与原始 Future 类似。

当我job.set_result在协程内部调用时,它会引发 a Future object is not initialized error,然后我尝试通过调用初始化 futureasyncio.ensure_future并出现相同的错误。

我尝试了更多,发现未来通常是由 创造的loop.create_future(),但是,没有选项来创建我的自定义未来。

下面是一个示例,如何初始化我的自定义未来?

import asyncio
from dataclasses import dataclass

@dataclass
class Job(asyncio.Future):
    job_task: Callable
    real_future: asyncio.Future = None
    something: str = None

    def schedule(self):
        async def run():
            res = await self.job_task()
            self.set_result(res) # raise error, future not initialized
            return res
        self.real_future = asyncio.ensure_future(run())

async def main():
    async def task():
        await asyncio.sleep(1)
        return 1
    job = Job(task)
    job.schedule()
    await job …
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-dataclasses

4
推荐指数
1
解决办法
2305
查看次数