标签: python-dataclasses

无法导入数据类模块

今天我从 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

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

腌制具有 __slots__ 的冻结数据类

如何使用 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__. 这只是一个错误吗?

python pickle slots python-dataclasses

9
推荐指数
2
解决办法
2216
查看次数

使用保留字“class”定义数据类的属性并将其序列化

好的,我正在尝试定义一个数据类来为 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”属性。

有没有更好的方法来做到这一点?

python dictionary reserved-words python-dataclasses

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

如何初始化Python数据类二维列表?

可以为初始化 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-3.x python-3.7 python-dataclasses

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

如何在 Python 数据类中使用 __post_init__ 方法

我正在尝试使用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 …

python-3.7 python-dataclasses

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

具有复杂结构的数据类实例的完整副本

我想创建数据类现有实例的副本并对其进行修改。

假设我们有一个数据类和该数据类的一个实例:

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)

让我们定义一个实例并尝试制作一个副本(我已经尝试过这篇文章中提出的解决方案):

  1. 使用replace方法:
d2 = replace(d1, **{})
Run Code Online (Sandbox Code Playgroud)

抛出错误

InitVar 'b' must be specified with replace()
Run Code Online (Sandbox Code Playgroud)

这似乎是一个已报告的错误,但我不确定是否有任何进展。

  1. __dict__ …

python python-3.x python-dataclasses

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

在带有 slot=True 的数据类中使用 super() 时出现类型错误

我有一个带有(某种)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 slots python-dataclasses

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

如何显示使用@dataclass类装饰器时生成的代码?

Python 3.7引入了dataclasses包含@dataclass装饰器的模块。该装饰器可以生成类函数。如何打印这些生成的函数?

python python-3.7 python-dataclasses

8
推荐指数
2
解决办法
160
查看次数

如何忽略传递给数据类的额外参数?

我想创建一个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'

python python-3.x python-dataclasses

8
推荐指数
3
解决办法
962
查看次数

Python 数据类,一个属性引用另一个属性

@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

python python-dataclasses python-class

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