FAQ
This is just an interesting code pattern that I have recently used:

class CacheStorage(object):
"""Generic cache storage class."""
@classmethod
def get_factory(cls,*args,**kwargs):
"""Create factory for a given set of cache storage creation
parameters."""
class CacheStorageFactory(cls):
_construct_args = args
_construct_kwargs = kwargs
def __init__(self):
cls.__init__(self,
*self._construct_args,**self._construct_kwargs)
return CacheStorageFactory

Then, I can create subclasses like:

class GdbmCacheStorage(CacheStorage):
"""Gdbm cache storage class.

@param basedir: Base directory where gdbm files should be stored.
@param basename: Base name for logging and creating gdbm files.
"""
def __init__(self,basedir,basename):
..... blablabla place initialization code here

class MemoryCacheStorage(CacheStorage):
"""In-Memory cache storage class.

Please note that keys and values are always mashal-ed.
E.g. when you cache an object, it makes a deep copy.
"""
def __init__(self):
..... blablabla place initialization code here


And the finally, I can create a factory that can create cache storage
instances for storing data in gdbm in a given directory:

cache_factory = GdbmCacheStorage.get_factory("~gandalf/db","test")
print cache_factory # <class '__main__.CacheStorageFactory'>
print cache_factory()

OR I can create a factory that can create instances for storing data in
memory:


cache_factory = MemoryCacheStorage.get_factory()
print cache_factory # <class '__main__.CacheStorageFactory'>
print cache_factory() # <__main__.CacheStorageFactory object at 0x8250c6c>


Now, here is my question. Am I right in doing this? Or are there better
language tools to be used in Python for the same thing? This whole thing
about creating factories looks a bit odd for me. Is it Pythonic enough?

Thanks,

Laszlo

Search Discussions

  • Eb303 at Mar 4, 2010 at 1:20 pm

    On Mar 3, 6:41?pm, Laszlo Nagy wrote:
    This is just an interesting code pattern that I have recently used:

    class CacheStorage(object):
    ? ? """Generic cache storage class."""
    ? ? @classmethod
    ? ? def get_factory(cls,*args,**kwargs):
    ? ? ? ? """Create factory for a given set of cache storage creation
    parameters."""
    ? ? ? ? class CacheStorageFactory(cls):
    ? ? ? ? ? ? _construct_args = args
    ? ? ? ? ? ? _construct_kwargs = kwargs
    ? ? ? ? ? ? def __init__(self):
    ? ? ? ? ? ? ? ? cls.__init__(self,
    ? ? ? ? ? ? ? ? ? ? *self._construct_args,**self._construct_kwargs)
    ? ? ? ? return CacheStorageFactory

    Then, I can create subclasses like:

    class GdbmCacheStorage(CacheStorage):
    ? ? """Gdbm cache storage class.

    ? ? @param basedir: Base directory where gdbm files should be stored.
    ? ? @param basename: Base name for logging and creating gdbm files.
    ? ? """
    ? ? def __init__(self,basedir,basename):
    ? ? ? ? ? ..... blablabla place initialization code here

    class MemoryCacheStorage(CacheStorage):
    ? ? """In-Memory cache storage class.

    ? ? Please note that keys and values are always mashal-ed.
    ? ? E.g. when you cache an object, it makes a deep copy.
    ? ? """
    ? ? def __init__(self):
    ? ? ? ? ? ..... blablabla place initialization code here

    And the finally, I can create a factory that can create cache storage
    instances for storing data in gdbm in a given directory:

    cache_factory = GdbmCacheStorage.get_factory("~gandalf/db","test")
    print cache_factory # <class '__main__.CacheStorageFactory'>
    print cache_factory()

    OR I can create a factory that can create instances for storing data in
    memory:

    cache_factory = MemoryCacheStorage.get_factory()
    print cache_factory # <class '__main__.CacheStorageFactory'>
    print cache_factory() # <__main__.CacheStorageFactory object at 0x8250c6c>

    Now, here is my question. Am I right in doing this? Or are there better
    language tools to be used in Python for the same thing? This whole thing
    about creating factories looks a bit odd for me. Is it Pythonic enough?

    Thanks,

    ? ?Laszlo
    Seems you try to reinvent functools:

    class GdbmCacheStorage(object):
    def __init__(self,basedir,basename):
    ...
    cache_factory = functools.partial(GdbmCacheStorage, "~gandalf/db",
    "test")
    print cache_factory()

    Is it what you're after? I didn't see the point in creating a "cached
    factory" for MemoryCacheStorage though, since it has no constructor
    parameters to cache anyway. So doing 'cache_factory =
    MemoryCacheStorage' in your example would do exactly the same thing as
    what you did.

    HTH
    - Eric -

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedMar 3, '10 at 5:41p
activeMar 4, '10 at 1:20p
posts2
users2
websitepython.org

2 users in discussion

Laszlo Nagy: 1 post Eb303: 1 post

People

Translate

site design / logo © 2022 Grokbase