其记录的属性是:
- [...]
- 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 实例,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 …
如果我想要一个实例属性是:
__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?
我是数据类的新手,正在尝试制作一种简单的方法将一个转换为字典,然后我可以从 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)
两个打印语句都是一个空字典“{}”,我似乎无法弄清楚为什么
我正在学习数据类,但我对 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 数据类进行试验。这里我有两个类,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_american也False默认设置为。但是,无论出于何种原因,数据类都没有触发is_european: Optional[bool] …
我有以下数据类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) 如何在@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 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”
以下 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) python ×9
python-3.x ×5
pydantic ×2
alias ×1
boolean ×1
data-class ×1
dictionary ×1
fastapi ×1