On 2012-06-06, at 9:00 PM, Nick Coghlan wrote: > On Thu, Jun 7, 2012 at 10:52 AM, Eric Snow <ericsnowcurren...@gmail.com> > wrote: >> Furthermore, using __signature__ as a cache may even cause problems. >> If the Signature object is cached then any changes to the function >> will not be reflected in the Signature object. Certainly that's an >> unlikely case, but it is a real case. If f.__signature__ is set, I'd >> expect it to be either an explicitly set value or exactly the same as >> the first time inspect.signature() was called for that function. We >> could make promises about that and do dynamic updates, etc., but it's >> not useful enough to go to the trouble. And without the guarantees, I >> don't think using it as a cache is a good idea. (And like I said, >> allowing/using an explicitly set f.__signature__ is a good thing). > > +1 > > Providing a defined mechanism to declare a public signature is good, > but using that mechanism for implicit caching seems like a > questionable idea. Even when it *is* cached, I'd be happier if > inspect.signature() returned a copy rather than a direct reference to > the original.
I'm leaning towards this too. Besides, constructing a Signature object isn't an expensive operation. So, the idea for the 'signature(obj)' function is to first check if 'obj' has '__signature__' attribute set, if yes - return it, if no - create a new one (but don't cache). I have a question about fixing 'functools.wraps()' - I'm not sure we need to. I see two solutions to the problem: I) We fix 'functools.wraps' to do: 'wrapper.__signature__ = signature(wrapped)' II) We modify 'signature(obj)' function to do the following steps: 1. check if obj has '__signature__' attribute. If yes - return it. 2. check if obj has '__wrapped__' attribute. If yes: obj = obj.__wrapped__; goto 1. 3. Calculate new signature for obj and return it. I think that the second (II) approach is better, as we don't implicitly cache anything, and we don't calculate Signatures on each 'functools.wraps' call. - Yury _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com