And*_*rin 6 python cython python-dataclasses
我正在使用 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)
Run Code Online (Sandbox Code Playgroud)
在没有 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
Run Code Online (Sandbox Code Playgroud)
有没有办法在不重写或最少重写源代码的情况下避免这个问题?
小智 8
在对此的支持合并到 Cython 之前,解决方法是手动将__annotations__属性添加到您的类并重复您的类型注释:
@dataclass
class Fieldset:
label: str
fields: List[Field] = []
__annotations__ = {
'label': str,
'fields': List[Field],
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
626 次 |
| 最近记录: |