[Python-Dev] Updated PEP 362 (Function Signature Object) (original) (raw)

Yury Selivanov yselivanov.ml at gmail.com
Thu Jun 7 03:16:37 CEST 2012


On 2012-06-06, at 9:00 PM, Nick Coghlan wrote:

On Thu, Jun 7, 2012 at 10:52 AM, Eric Snow <ericsnowcurrently at 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.



More information about the Python-Dev mailing list