Andrew Koenig wrote:
> I note in PEP 3000 the proposal to remove callable(), with the comment "just
> call the object and catch the exception."
> 
> I think that's a bad idea, because it takes away the ability to separate the
> callability test from the first call.  As a simple example, suppose you're
> writing a function that you expect to be given a function as one of its
> arguments:
> 
>       def foo(bar, fun):
>               assert callable(fun)
>               # ...
> 
> It might be that foo doesn't actually call fun until much later.
> Nevertheless, from a testing viewpoint, it would be better to detect the
> error immediately of passing something that can't be called.
> 
> If you didn't have callable, how would you write this example?

How about changing callable's semantics to something like the following?:

   def callable(obj, attr="__call__"):
       if attr != "__call__":
           obj = getattr(obj, attr, None)
       return getattr(obj, "__call__", None) is not None


Test for callability:

   assert callable(obj)

Test for hashability:

   assert callable(obj, "__hash__")

Test for iterability:

   assert callable(obj, "__iter__")

Test for a context manager:

   assert callable(obj, "__enter__") and callable(obj, "__exit__")

Cheers,
Nick.

-- 
Nick Coghlan   |   [EMAIL PROTECTED]   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org
_______________________________________________
Python-3000 mailing list
Python-3000@python.org
http://mail.python.org/mailman/listinfo/python-3000
Unsubscribe: 
http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com

Reply via email to