simple (I hope!) problem
Jean-Michel Pichavant
jeanmichel at sequans.com
Thu Aug 5 05:32:06 EDT 2010
samwyse wrote:
> On Aug 3, 1:20 am, Steven D'Aprano <steve-REMOVE-
> T... at cybersource.com.au> wrote:
>
>> On Mon, 02 Aug 2010 17:19:46 -0700, samwyse wrote:
>>
>>> Fortunately, I don't need the functionality of the object, I just want
>>> something that won't generate an error when I use it. So, what is the
>>> quickest way to to create such an object (replacing the 'pass' in my
>>> first snippet). My solution is this:
>>>
>>> class C:
>>> def filter(self, *args, **kwds):
>>> pass
>>> register = C()
>>>
>>> but it seems like I should be able to do something "better", as measured
>>> by lines of code, faking more than just a 'filter' method, or both. Any
>>> ideas? Thanks!
>>>
>> You want a variation on the Null Object design pattern.
>>
>> class NullWithMethods(object):
>> def __getattr__(self, name):
>> return self
>> def __call__(self, *args, **kwargs):
>> pass
>>
>> And in action:
>>
>>
>>>>> c = NullWithMethods()
>>>>> c.spam("hello", "world")
>>>>> c.something_completely_unlikely.spam.ham("hello", "world", foo=42)
>>>>>
>> --
>> Steven
>>
>
> JM emailed me a good solution, but yours is great! Thanks!
>
The version I gave you overrides __getattribute__. To be honest,
overriding __getattr__ is a better solution.Just in case you don't know
the difference, __getattr__ is called only if the attribute is not found
while __getattribute__ is actually called to find the attribute.
JM
More information about the Python-list
mailing list