标签: python-dataclasses

dataclasses.Field 不会将类型注释解析为实际类型

python 的标准数据类模块的Field类的文档仅指定:

其记录的属性是:

  • [...]
  • type:字段的类型。

对我来说,这似乎意味着该字段将包含类型本身,而不仅仅是字符串形式的名称。

但是,它似乎只是按原样复制类型注释,使其变得毫无用处。

例子:

@dataclasses.dataclass 
class C: 
    c: 'C'

dataclasses.fields(C)[0].type # This returns the string 'C'
typing.get_type_hints(C)['c'] # This returns the class C, as expected
Run Code Online (Sandbox Code Playgroud)

该问题甚至在使用PEP563类型注释时系统性地发生。

这是数据类模块中的错误吗?这是预期的行为吗?如果是这样,我如何检索给定 Field 实例的类型对象?

python python-dataclasses

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

嵌套在另一个数据类中的数据类无法正确更新数据

我生成了两个不同的 python 实例,dataclass其中包含一个嵌套的dataclass. 当我更新嵌套dataclass在一个实例中(而不是在另一个实例中)中的值时,相同的数据被放置dataclass两个实例中的嵌套中。这不是我所期望的。

from dataclasses import dataclass


@dataclass
class sub1:
    q: int = 10
    r: str = "qrst"


@dataclass
class A:
    a: int = 1
    s1: sub1 = sub1()


if __name__ == '__main__':
    a = A()
    aa = A()
    aa.a = 9
    aa.s1.r = "92"
    print("a:", repr(a))
    print("aa:", repr(aa))

''' Produces --
a: A(a=1, s1=sub1(q=10, r='92'))
aa: A(a=9, s1=sub1(q=10, r='92'))
'''
Run Code Online (Sandbox Code Playgroud)

我希望嵌套dataclass只在指定的实例 ( aa) 中更新,而嵌套dataclass …

python python-3.x python-dataclasses

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

如何使数据类实例属性非公共和 __init__ arg?

如果我想要一个实例属性是:

  • 非公开(又名有一个前导下划线)
  • __init__作为签名中的参数

通常,我会这样做:

class Foo:
    def __init__(self, bar: str):
        self._bar = bar

foo = Foo(bar="bar")  # foo.bar would raise an AttributeError
Run Code Online (Sandbox Code Playgroud)

但是,在 中dataclasses,我不确定如何执行此操作。

from dataclasses import dataclass

@dataclass
class Foo:
    bar: str  # This leaves bar as a public instance attribute
Run Code Online (Sandbox Code Playgroud)

执行此操作的正确方法是什么dataclasses.dataclass

python python-dataclasses

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

来自数据类的字典返回空字典

我是数据类的新手,正在尝试制作一种简单的方法将一个转换为字典,然后我可以从 JSON 文件中保存和加载。在实现应用程序所需的基础结构之前,我正在一个小型数据类上对其进行测试,其中包含我将使用的变量,如下所示:

from dataclasses import dataclass, asdict
@dataclass 
class TestClass:
    def __init__(self, floatA:[float], intA:[int], floatB:[float]):
        self.var1 = floatA
        self.var2 = intA
        self.var3 = floatB

    def ConvertToDict(self):
        return asdict(self)

test = TestClass([0.2,0.1,0.5], [1,2,3], [0.9,0.7,0.6])
print(asdict(test))
print(test.ConvertToDict())
Run Code Online (Sandbox Code Playgroud)

两个打印语句都是一个空字典“{}”,我似乎无法弄清楚为什么

python dictionary python-dataclasses

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

Python 中数据类的 sort_index 的用途是什么?

我正在学习数据类,但我对 sort_index 的目的及其实际工作原理感到困惑。

我似乎找不到任何有价值的信息。Python 官方文档没有提及这一点,这令人难以置信。

这是一个例子:

@dataclass(order=True)
class Person:
    sort_index: int = field(init=False, repr=False)
    name: str
    age: int
    weight: int = 190
 
    def __post_init__(self):
        self.sort_index = self.weight
Run Code Online (Sandbox Code Playgroud)

那么,sort_index的目的是什么?它是干什么用的?我什么时候使用它?

再次感谢您花时间回答我的问题。我是Python新手。

python python-3.x data-class python-dataclasses

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

为什么我的 Python 数据类没有正确初始化布尔值?

我目前正在为期权定价编写一些代码,同时我一直在尝试使用 Python 数据类进行试验。这里我有两个类,Option()and Option2(),前者用数据类语法编写,后者用传统类语法编写。

from dataclasses import dataclass, field
from typing import Optional

@dataclass
class Option:
    is_american: Optional[bool] = field(default=False)
    is_european: Optional[bool] = not is_american

class Option2:
    def __init__(is_american=False):
        self.is_european = not is_american

if __name__ == "__main__":
    eu_option1 = Option()
    print(f"{eu_option1.is_european = }")
    
    eu_option2 = Option2()
    print(f"{eu_option2.is_european = }")
Run Code Online (Sandbox Code Playgroud)

输出给出

eu_option1.is_european = False
eu_option2.is_european = True
Run Code Online (Sandbox Code Playgroud)

然而,非常奇怪的事情发生了。注意在这种Option2()情况下,默认情况下is_american是如何设置False的,因此is_european必须是True并且确实如此,所以这是预期的行为。

但在这种dataclass Option()情况下,is_americanFalse默认设置为。但是,无论出于何种原因,数据类都没有触发is_european: Optional[bool] …

python boolean python-3.x python-dataclasses

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

如何限制数据类属性中的值?

我有以下数据类Gear,我想将 gear_level 的最大值限制为 0 到 5。但是正如您所看到的,当我增加 gear_level 时,它会高于 5,这不是我想要的。我尝试了方法以及postinit。我该如何解决这个问题?

from dataclasses import dataclass

@dataclass
class Gear:
    gear_level: int = 0
    direction: str = None
    # more codes ...

    def __postinit__(self):
        if self.gear_level <= 0:
            self.gear_level = 0
        elif 5 > self.gear_level > 0:
            self.gear_level = self.gear_level
        else:
            self.gear_level = 5

    def set_gear_level(self, level):
        if level <= 0:
            self.gear_level = 0
        elif 5 > level > 0:
            self.gear_level = level
        else:
            self.gear_level = 5


g = Gear() …
Run Code Online (Sandbox Code Playgroud)

python python-dataclasses

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

@dataclass Python类中的拼写错误的字段

如何在@dataclass-decorated Python类中设置拼写错误的字段时引发异常?

我想要一种实用的方法来做到这一点.我需要写自己的装饰师吗?

@dataclass
class C(object):
    x: int = 1

obj = C()
obj.y = 2  # should raise an exception
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-dataclasses

0
推荐指数
1
解决办法
125
查看次数

ImportError:无法导入名称“Annotated”和“ValueRange”

你好我正在使用Python 3.8

我正在实现一个带有修复列表的数据类,为了做到这一点,我有以下代码:

from dataclasses import dataclass
from typing import Annotated, List, ValueRange
from pydantic import validate_arguments

@validate_arguments
@dataclass
class WorldArea:
    ...
    data: Annotated[List[float], ValueRange(1, 3)]
    ...
Run Code Online (Sandbox Code Playgroud)

这个想法是数据将是一个包含 1、2 或 3 个元素的列表,正如您所看到的,我正在使用 Annotated 和 ValueRange,但是当我执行时,我收到以下错误:

文件“a.py”,第 2 行,来自键入导入列表,ValueRange ImportError:无法从“打字”导入名称“注释”

文件“a.py”,第 2 行,来自键入导入列表,ValueRange ImportError:无法从“打字”导入名称“ValueRange”

python python-dataclasses python-typing pydantic

0
推荐指数
1
解决办法
9314
查看次数

数据类的 FastAPI 查询不适用于别名

以下 FastAPI 代码对我产生了意想不到的行为:

import uvicorn
from fastapi import FastAPI, Depends, Query
from typing import Optional
from pydantic.dataclasses import dataclass


app = FastAPI()

@dataclass
class Catz:
    qqq: Optional[str] = Query(None, alias="q")

@app.get("/productz/")
def search_products(query: Catz = Depends(Catz)  ):
    products = [{"name": "Computer"}, {"name": "HDD"}]
    if not query.qqq:
        query.qqq = ""
    return {"query": query, "results": [product for product in products if query.qqq in product["name"]]}


@dataclass
class Cats:
    qqq: Optional[str] = Query(None )

@app.get("/products/")
def search_products(query: Cats = Depends(Cats)  ):
    products = [{"name": …
Run Code Online (Sandbox Code Playgroud)

alias python-3.x python-dataclasses pydantic fastapi

0
推荐指数
1
解决办法
1146
查看次数