今天我从 apt-get 安装了 python 3.7 来试用新的 dataclasses 模块。我单独安装它是因为 python3.6 不能升级到 3.7。
当我输入: 时python3.7 --version,它给了我:>>> Python 3.7.0a2作为我当前的版本。
问题是我似乎无法导入数据类。
我的进口声明是:from dataclasses import dataclass按照这里的指示
这是它给我的错误信息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'dataclasses'
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
from apport.report import Report
File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in …Run Code Online (Sandbox Code Playgroud) python python-import python-3.x python-3.7 python-dataclasses
如何使用 pickle 冻结数据类的实例__slots__?例如,以下代码在 Python 3.7.0 中引发异常:
import pickle
from dataclasses import dataclass
@dataclass(frozen=True)
class A:
__slots__ = ('a',)
a: int
b = pickle.dumps(A(5))
pickle.loads(b)
Run Code Online (Sandbox Code Playgroud)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 3, in __setattr__
dataclasses.FrozenInstanceError: cannot assign to field 'a'
Run Code Online (Sandbox Code Playgroud)
如果我删除frozen或__slots__. 这只是一个错误吗?
好的,我正在尝试定义一个数据类来为 sidekiq 工作人员在 redis 中排队作业,sidekiq 有效负载的规范需要一些具有以下格式的属性:
{
"class": "SomeWorker",
"queue": "default"
"jid": "b4a577edbccf1d805744efa9", // 12-byte random number as 24 char hex string
"args": [......],
"created_at": 1234567890,
"enqueued_at": 1234567890
}
Run Code Online (Sandbox Code Playgroud)
所以我在我的 python 代码中定义了一个数据类:
@dataclass
class PusherNotificationJob:
args: Any = None
queue: str = "default"
jid: str = secrets.token_hex(12)
retry: bool = True
created_at: datetime.datetime = time.time()
enqueued_at: datetime.datetime = time.time()
def asdict(self):
return {** self.__dict__, "class": "SomeWorker"}
Run Code Online (Sandbox Code Playgroud)
我的问题是我无法将“类”定义为 PusherNotificationJob 的属性,因为它是一个保留字。所以我需要定义 asdict 方法来序列化为 dict 并添加我在这里添加的“class”属性。
有没有更好的方法来做到这一点?
可以为初始化 2D 数组的 python 数据类创建默认初始化程序,即结果与
from dataclasses import dataclass, field
from typing import List
MAX = 5
@dataclass
class AlgoData:
list2D: List[List[int]] # = ???
list1D: List[int] = field(default_factory=list)
b = [[] for m in range(MAX)]
a = AlgoData(b)
Run Code Online (Sandbox Code Playgroud)
但没有b争论。结果:
AlgoData(list2D=[[], [], [], [], []], list1D=[])
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Python中的数据类,我想做的是在我的类中拥有一个计算字段,并将 sort_index 字段添加到调用中,但也希望将其冻结,以便我无法修改任何属性定义后的此类。下面是我的代码:
from dataclasses import dataclass, field
def _get_year_of_birth(age: int, current_year: int=2019):
return current_year - age
@dataclass(order=True, frozen=True)
class Person():
sort_index: int = field(init=False, repr=False)
name: str
lastname: str
age: int
birthyear: int = field(init=False)
def __post_init__(self):
self.sort_index = self.age
self.birthyear = _get_year_of_birth(self.age)
if __name__ == "__main__":
persons = [
Person(name="Jack", lastname="Ryan", age=35),
Person(name="Jason", lastname="Bourne", age=45),
Person(name="James", lastname="Bond", age=60)
]
sorted_persons = sorted(persons)
for person in sorted_persons:
print(f"{person.name} and {person.age} and year of birth is : {person.birthyear}")
Run Code Online (Sandbox Code Playgroud)
看来我无法在类中设置自定义排序字段,也无法创建从其他属性计算得出的任何属性,因为我使用的是 freeze …
我想创建数据类现有实例的副本并对其进行修改。
假设我们有一个数据类和该数据类的一个实例:
from dataclasses import dataclass, field, InitVar, replace
@dataclass
class D:
a: float = 10. # Normal attribute with a default value
b: InitVar[float] = 20. # init-only attribute with a default value
c: float = field(init=False) # an attribute that will be defined in __post_init__
def __post_init__(self, b):
self.c = self.a + b
d1 = D()
Run Code Online (Sandbox Code Playgroud)
让我们定义一个实例并尝试制作一个副本(我已经尝试过这篇文章中提出的解决方案):
replace方法:d2 = replace(d1, **{})
Run Code Online (Sandbox Code Playgroud)
抛出错误
InitVar 'b' must be specified with replace()
Run Code Online (Sandbox Code Playgroud)
这似乎是一个已报告的错误,但我不确定是否有任何进展。
__dict__ …我有一个带有(某种)getter 方法的数据类。
此代码按预期工作:
from dataclasses import dataclass
@dataclass()
class A:
def get_data(self):
# get some values from object's fields
# do some calculations
return "a calculated value"
@dataclass()
class B(A):
def get_data(self):
data = super().get_data()
return data + " (modified)"
b = B()
print(b.get_data()) # a calculated value (modified)
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加slots=True,我会得到TypeError:
from dataclasses import dataclass
@dataclass(slots=True)
class A:
def get_data(self):
return "a calculated value"
@dataclass(slots=True)
class B(A):
def get_data(self):
data = super().get_data()
return data + " (modified)" …Run Code Online (Sandbox Code Playgroud) Python 3.7引入了dataclasses包含@dataclass装饰器的模块。该装饰器可以生成类函数。如何打印这些生成的函数?
我想创建一个config dataclass,以简化对特定环境变量的白名单和访问(os.environ['VAR_NAME']相对于而言,输入代码很麻烦config.VAR_NAME)。因此,我需要无视我的未使用的环境变量dataclass的__init__函数,但我不知道如何提取默认__init__为了与例如,一个函数,还包括将其包装*_为一体的论据之一。
import os
from dataclasses import dataclass
@dataclass
class Config:
VAR_NAME_1: str
VAR_NAME_2: str
config = Config(**os.environ)
Run Code Online (Sandbox Code Playgroud)
运行这个给了我TypeError: __init__() got an unexpected keyword argument 'SOME_DEFAULT_ENV_VAR'。
@dataclass
class Stock:
symbol: str
price: float = get_price(symbol)
Run Code Online (Sandbox Code Playgroud)
一个属性可以dataclass访问另一个属性吗?在上面的示例中,可以Stock通过提供符号和价格来创建 。如果未提供价格,则默认为我们从某个函数获取的价格get_price。有没有办法引用符号?
该示例生成错误NameError: name 'symbol' is not defined。