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