首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找不到PicklingError函数

找不到PicklingError函数
EN

Stack Overflow用户
提问于 2020-07-02 17:33:13
回答 1查看 593关注 0票数 1

我正在尝试使用化脓性 & dask进行一些并行数据验证。

代码语言:javascript
复制
import dask.bag as db
from pydantic import BaseModel

class MyData(BaseModel):
    id: int
    name: str

def validate_data(data):
    return MyData(**data)

data = [
    {'id': 1, 'name': 'Foo'}, 
    {'id': 2, 'name': 'Bar'}
]

bag = db.from_sequence(data)
bag.map(validate_data).compute()

这会引发以下酸洗错误(完全堆栈跟踪可用这里):

代码语言:javascript
复制
~/Library/Caches/pypoetry/virtualenvs/domi-IWOYYLRr-py3.7/lib/python3.7/site-packages/cloudpickle/cloudpickle.py in save_global(self, obj, name, pack)
    840             self._save_parametrized_type_hint(obj)
    841         elif name is not None:
--> 842             Pickler.save_global(self, obj, name=name)
    843         elif not _is_importable_by_name(obj, name=name):
    844             self.save_dynamic_class(obj)

~/.pyenv/versions/3.7.6/lib/python3.7/pickle.py in save_global(self, obj, name)
    958             raise PicklingError(
    959                 "Can't pickle %r: it's not found as %s.%s" %
--> 960                 (obj, module_name, name)) from None
    961         else:
    962             if obj2 is not obj:

PicklingError: Can't pickle <cyfunction int_validator at 0x116503460>: it's not found as pydantic.validators.lambda11

注意,我可以很好地处理这个函数:

代码语言:javascript
复制
>>> import pickle

>>> validate_data
<function __main__.validate_data(data)>
>>> pickled = pickle.dumps(validate_data)
>>> unpickled = pickle.loads(pickled)
>>> unpickled
<function __main__.validate_data(data)>
>>> unpickled({'id': 5, 'name': 'Foo'})
MyData(id=5, name='Foo')

关于如何修复,有什么想法或建议吗?(我不确定这是达斯克还是吡喃类药物的问题,所以我对两者都做了标记)

提前感谢!

系统/包信息:

  • Dask版本: 2.19.0
  • 平庸版本: 1.5.1
代码语言:javascript
复制
❯ python -c "import pydantic.utils; print(pydantic.utils.version_info())"
             pydantic version: 1.5.1
            pydantic compiled: True
                 install path: /Users/ianwhitestone/Library/Caches/pypoetry/virtualenvs/domi-IWOYYLRr-py3.7/lib/python3.7/site-packages/pydantic
               python version: 3.7.6 (default, Mar  7 2020, 14:34:51)  [Clang 11.0.0 (clang-1100.0.33.17)]
                     platform: Darwin-19.5.0-x86_64-i386-64bit
     optional deps. installed: ['typing-extensions']
EN

回答 1

Stack Overflow用户

发布于 2020-07-02 22:41:58

将pydantic模型定义移到单独的文件中解决了这一问题:

代码语言:javascript
复制
# my_data.py
from pydantic import BaseModel

class MyData(BaseModel):
    id: int
    name: str
代码语言:javascript
复制
# main.py
import dask.bag as db
from my_data import MyData

def validate_data(data):
    return MyData(**data)

data = [
    {'id': 1, 'name': 'Foo'}, 
    {'id': 2, 'name': 'Bar'}
]

bag = db.from_sequence(data)
bag.map(validate_data).compute()

把这个标记为现在的答案,如果有人对为什么会这样做有解释的话,我会把它标记为答案!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62702040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档