tobgu/pyrsistent

Mixin support?

Open

#130 建立於 2018年4月24日

在 GitHub 查看
 (7 留言) (0 反應) (0 負責人)Python (141 fork)batch import
enhancementhelp wanted

倉庫指標

Star
 (1,943 star)
PR 合併指標
 (30 天內沒有已合併 PR)

描述

  1. Mixining two classes that both inherit from pyrsistent.PClass fails:
import pyrsistent

class TimestampMixin(pyrsistent.PClass):
    created_at = pyrsistent.field()
    deleted_at = pyrsistent.field()
    updated_at = pyrsistent.field()

class IDMixin(pyrsistent.PClass):
    id = pyrsistent.field()

class UserEntity(IDMixin, TimestampMixin):
    pass

produces:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-808a9f22c5af> in <module>()
      9     id = pyrsistent.field()
     10
---> 11 class UserEntity(IDMixin, TimestampMixin):
     12     pass

~/.local/share/virtualenvs/server-hvEypR1j/lib/python3.6/site-packages/pyrsistent/_pclass.py in __new__(mcs, name, bases, dct)
     20             dct['__slots__'] += ('__weakref__',)
     21
---> 22         return super(PClassMeta, mcs).__new__(mcs, name, bases, dct)
     23
     24 _MISSING_VALUE = object()

TypeError: multiple bases have instance lay-out conflict
  1. Using a mixin which doesn't inherit from PClass doesn't have it's fields registered:
import pyrsistent

class TimestampMixin:
    created_at = pyrsistent.field()
    deleted_at = pyrsistent.field()
    updated_at = pyrsistent.field()

class IDMixin(pyrsistent.PClass):
    id = pyrsistent.field()

class UserEntity(IDMixin, TimestampMixin):
    pass
assert list(UserEntity._pclass_fields) == ['id']  # expecting: id, created_at, deleted_at, updated_at

Is there a suggested way to use mixins without falling back to: type('UserEntity', (pyrsistent.PClass,), namespace) where namespace is effectively a user-manifest mixin?

貢獻者指南