msg208671 - (view) |
Author: Yury Selivanov (yselivanov) *  |
Date: 2014-01-21 16:50 |
inspect.Signature and inspect.Parameter are immutable structures, and it makes sense to make them hashable too. Patch is attached. |
|
|
msg208673 - (view) |
Author: Brett Cannon (brett.cannon) *  |
Date: 2014-01-21 16:59 |
This is a new feature so it can't go into Python 3.4. |
|
|
msg208674 - (view) |
Author: Yury Selivanov (yselivanov) *  |
Date: 2014-01-21 17:00 |
Fair enough. |
|
|
msg214962 - (view) |
Author: Yury Selivanov (yselivanov) *  |
Date: 2014-03-27 16:14 |
If nobody has any objections on this, I'm going to commit this in 3.5 soon. |
|
|
msg215768 - (view) |
Author: Roundup Robot (python-dev)  |
Date: 2014-04-08 15:47 |
New changeset 932d69ef0c63 by Yury Selivanov in branch 'default': inspect: Make Signature and Parameter hashable. Issue #20334. http://hg.python.org/cpython/rev/932d69ef0c63 |
|
|
msg225343 - (view) |
Author: Antony Lee (Antony.Lee) * |
Date: 2014-08-15 06:01 |
The hash function of the Signature class is actually incompatible with the definition of Signature equality, which doesn't consider the order of keyword-only arguments: >>> from inspect import signature >>> s1 = signature(lambda *, x, y: None); s2 = signature(lambda *, y, x: None) >>> s1 == s2 True >>> hash(s1) == hash(s2) False Actually the implementation of Signature.__eq__ seems way too complicated; I would suggest making a helper method returning (return_annotation, tuple(non-kw-only-params), frozenset(kw-only-params)) so that __eq__ can compare these values while __hash__ can hash that tuple. |
|
|
msg225361 - (view) |
Author: Yury Selivanov (yselivanov) *  |
Date: 2014-08-15 19:20 |
Thanks, Antony, this is a good catch. Your suggestion seems like a good idea. I'll look into this more closely soon. |
|
|
msg225364 - (view) |
Author: Antony Lee (Antony.Lee) * |
Date: 2014-08-15 20:37 |
Actually, that specific solution (using a helper method) will fail because there may be unhashable params (due to unhashable default values or annotations) among the keyword-only arguments, so it may not be possible to build a frozenset (rather, one should compare the {param.name: param if param.kind == KEYWORD_ONLY} dict). The frozenset approach still works for computing the hash as this requires all params to be hashable anyways. |
|
|
msg226820 - (view) |
Author: Yury Selivanov (yselivanov) *  |
Date: 2014-09-12 14:26 |
Antonie, I'm attaching a patch (-2.01.patch) to this issue which should fix the problem. Please review. |
|
|
msg226831 - (view) |
Author: Antony Lee (Antony.Lee) * |
Date: 2014-09-12 18:02 |
While your patch works, I think it is a good opportunity to simplify the implementation of Signature.__eq__, which is *much* more complicated than what it should be. Please comment on the attached patch, which uses the helper method approach I suggested. |
|
|
msg226840 - (view) |
Author: Roundup Robot (python-dev)  |
Date: 2014-09-12 19:48 |
New changeset 3b974b61e74d by Yury Selivanov in branch 'default': inspect.Signature: Fix discrepancy between __eq__ and __hash__. http://hg.python.org/cpython/rev/3b974b61e74d |
|
|
msg226841 - (view) |
Author: Yury Selivanov (yselivanov) *  |
Date: 2014-09-12 19:50 |
Antony, I've tweaked the patch a bit and it's now in default branch. Thank you! |
|
|