33

使用法コードでファクトリを指定せずに、collections.defaultdict のように動作するクラスを作成したいと考えています。EG: 代わりに

class Config(collections.defaultdict):
    pass

これ:

Config = functools.partial(collections.defaultdict, list)

これでほぼ動きますが、

isinstance(Config(), Config)

失敗します。この手がかりは、より深いところにもっとよこしまな問題があることを意味していると思います。それで、実際にこれを達成する方法はありますか?

私も試しました:

class Config(Object):
    __init__ = functools.partial(collections.defaultdict, list)
4

5 に答える 5

9

同様の問題がありましたが、部分的に適用されたクラスのインスタンスをピクル可能にする必要もありました。私が最終的に得たものを共有すると思いました。

Python 自身のcollections.namedtuple. 以下の関数は、ピクルできる名前付きサブクラスを作成します。

from functools import partialmethod
import sys

def partialclass(name, cls, *args, **kwds):
    new_cls = type(name, (cls,), {
        '__init__': partialmethod(cls.__init__, *args, **kwds)
    })

    # The following is copied nearly ad verbatim from `namedtuple's` source.
    """
    # For pickling to work, the __module__ variable needs to be set to the frame
    # where the named tuple is created.  Bypass this step in enviroments where
    # sys._getframe is not defined (Jython for example) or sys._getframe is not
    # defined for arguments greater than 0 (IronPython).
    """
    try:
        new_cls.__module__ = sys._getframe(1).f_globals.get('__name__', '__main__')
    except (AttributeError, ValueError):
        pass

    return new_cls
于 2019-09-21T10:26:11.537 に答える