【问题标题】:Using dataclasses with Cython在 Cython 中使用数据类
【发布时间】:2019-09-28 11:17:25
【问题描述】:

我正在使用 cython 进行代码混淆,因此目前性能不是问题。问题在于使用数据类。

cythonize 包含数据类定义的代码在编译期间没有错误。但是在运行代码时,我得到一个TypeError: <field> is a field but has no type annotation.

这是我试图 cythonize 的代码:

from dataclasses import dataclass, field
from typing import Dict, Any, List

@dataclass
class dataclass_test:
    ddict: Dict[str, Any]
    sstr: str
    bbool: bool
    llist: List[str]
    ffloat: float
    llist1: List[str] = field(default_factory=list)

在没有 cythonization 的情况下运行代码可以正常工作。但在 cythonization 之后,我收到以下错误消息:

 File "dataclass_.py", line 4, in init dataclass_
    @dataclass   File "/home/aryskin/miniconda3/envs/tf113_gpu_conda/lib/python3.7/dataclasses.py", line 991, in dataclass
    return wrap(_cls)   File "/home/aryskin/miniconda3/envs/tf113_gpu_conda/lib/python3.7/dataclasses.py", line 983, in wrap
    return _process_class(cls, init, repr, eq, order, unsafe_hash, frozen)   File "/home/aryskin/miniconda3/envs/tf113_gpu_conda/lib/python3.7/dataclasses.py", line 857, in _process_class
    raise TypeError(f'{name!r} is a field but has no type annotation') TypeError: 'llist1' is a field but has no type annotation

有没有什么办法可以避免这个问题而无需或只重写源代码?

【问题讨论】:

标签: python cython python-dataclasses


【解决方案1】:

在将对此的支持合并到 Cython 之前,一种解决方法是手动将 __annotations__ 属性添加到您的类并重复您的类型注释:

@dataclass
class Fieldset:
    label: str
    fields: List[Field] = []

    __annotations__ = {
        'label': str,
        'fields': List[Field],
    }

【讨论】:

  • 这实际上正在工作,尽管它带回了数据类应该删除的样板。我想我们只需要在 Cython 中支持数据类。同时,谢谢@cdr
  • @SalvatoreCosentino 我相信它们现在在当前的 master 分支中得到了支持(尽管我认为它还没有发布)。
猜你喜欢
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多