|
msg78788 - (view) |
Author: Hagen Fürstenau (hagen) |
Date: 2009-01-02 12:46 |
If we call some function f with a generator as star argument and this
generator raises a TypeError, we get the following exception:
>>> def f(x): pass
...
>>> def broken(): raise TypeError
...
>>> f(*(broken() for x in (0,)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() argument after * must be a sequence, not generator
This is a misleading error message, as it's usually no problem to use a
generator as a star argument. Even just replacing the TypeError by some
other exception leads to the expected result, i.e. the exception gets
correctly propagated.
The problem seems to be around line 3710 of Python/ceval.c where the
generator is converted to a tuple. If this conversion raises a
TypeError, then the error message is replaced, which will mask any
TypeError raised by the generator.
I'm not sure how to solve this. We probably can't distinguish a "good"
TypeError from a "bad" TypeError at this point, so we might have to make
a special case for the conversion of generators.
|
|
msg78800 - (view) |
Author: Amaury Forgeot d'Arc (amaury.forgeotdarc) *  |
Date: 2009-01-02 14:26 |
The issue1615 has the same kind of problems: an AttributeError is masked
by another one.
|
|
msg78957 - (view) |
Author: Hagen Fürstenau (hagen) |
Date: 2009-01-03 13:44 |
I'm getting confused about whether it's actually desired behaviour that
generators can be star arguments.
The error message seems to say it's not: "argument after * must be a
sequence". The docs seem to agree: "If the syntax *expression appears in
the function call, expression must evaluate to a sequence." However
test_extcall specifically tests function calls with (non-sequence)
iterables as star arguments.
|
|
msg88770 - (view) |
Author: Kenneth Arnold (kcarnold) |
Date: 2009-06-02 22:43 |
I can confirm that (a) this exact behavior is happening and (b) it quite
confused me (most of the time it works!). What would be a "good"
TypeError? I'd vote for generators to be explicitly supported even if it
required a special case. Thanks!
|
|
msg88800 - (view) |
Author: Hagen Fürstenau (hagen) |
Date: 2009-06-03 09:13 |
I added a simple check for iterables. This is not very elegant, but
performance is only affected in the case of an exception. Patch and
corresponsing test are attached as "TypeError.patch".
As I pointed out above, the actual error message "must be a sequence" is
also inconsistent with the implementation (and tests) which allows any
kind of iterable. The attached and independent patch
"message_and_docs.patch" changes this to "must be an iterable" and
corrects docs and tests accordingly.
|
|
msg88803 - (view) |
Author: Amaury Forgeot d'Arc (amaury.forgeotdarc) *  |
Date: 2009-06-03 11:10 |
This patch leaks a reference on each call to PyObject_GetIter(). And I'm
not sure it is a good idea to call this function again: it may be very
expensive! I'd prefer a simple check on the tp_iter member.
|
|
msg88807 - (view) |
Author: Hagen Fürstenau (hagen) |
Date: 2009-06-03 11:46 |
Sorry, I had meant to use PyIter_Check instead of PyObject_GetIter.
Don't know why I didn't do so... ;-)
I corrected the patch.
|
|
msg104861 - (view) |
Author: Bruce Frederiksen (dangyogi) |
Date: 2010-05-03 17:51 |
I have also hit this error. I went to report it but found it already entered (good news), but not resolved from nearly a year ago (bad news).
The error masked another bug that I had in my program and it took me quite awhile to figure out what the real problem was.
I use *generator arguments quite a lot, so was surprised to see the error. So I, for one, can say that if you disable *generator arguments, you will break existing code.
If anybody cares, I have verified that this error also appears in Python2.5 and Python2.4 and am attempting to add python2.5 to the Versions list. (And yes, *generators were allowed in Python2.4!)
Is this headed for resolution? Progress on it seems to have stalled nearly a year ago. Can I vote to revive this?
|
|
msg112896 - (view) |
Author: Terry J. Reedy (terry.reedy) *  |
Date: 2010-08-04 21:08 |
I verified with 3.1 the two OP cases and that generators work fine as long as they supply the correct number of values.
def f(x): return x
def broken(): return 1
print(f(*(broken() for x in (0,))))
# prints 1
Change (0,) to (0,1) the normal arg num mismatch message appears.
test_extcall tests version of Nothing() that follow both the old and new iteration protocol. It is possible that 'sequence' in meant in the broader sense of finite iterable rather that the narrow sense of
5.6. Sequence Types — str, bytes, bytearray, list, tuple, range
Since that is confusing, I would replace 'sequence' with 'finite iterable'. (Infinite iterables, obviously, are bad, just as in any other uncontrolled situation, such as "a,*b = itertools.count()".)
So, combine the correction and the suggestion above with original and diff against current trunk (py3k branch) if you can or at least 3.1.2.
|
|
msg112960 - (view) |
Author: Hagen Fürstenau (hagen) |
Date: 2010-08-05 08:55 |
IIUC, the only change you suggest for my patch is using "finite iterable" instead of "sequence" or "iterable", right?
I've looked at the docs and there seems to be no precedent for "finite iterable". I think it's just as obvious that the iterable has to yield a correct (and finite) number of parameters as the fact that "list(itertools.count())" is a bad idea. So for consistency I would like to keep "iterable".
|
|
msg112998 - (view) |
Author: Terry J. Reedy (terry.reedy) *  |
Date: 2010-08-05 16:34 |
Ok, leave iterable as is. More important, you have two disjoint patches that I believe should be combined.
|
|
msg113022 - (view) |
Author: Hagen Fürstenau (hagen) |
Date: 2010-08-05 19:13 |
Attaching a combined patch against the current py3k.
|
|
msg130168 - (view) |
Author: Daniel Urban (durban) |
Date: 2011-03-06 12:35 |
I think the patch isn't entirely correct. It uses PyIter_Check for detecting the case when an *iterable* raises TypeError, but that function actually checks for an *iterator*. The check on the tp_iter member mentioned by Amaury Forgeot d'Arc probably would be better, but even that wouldn't detect every iterable: "Its presence normally signals that the instances of this type are iterable (although sequences may be iterable without this function)." (http://docs.python.org/dev/py3k/c-api/typeobj.html#PyTypeObject.tp_iter) (Apparently any object with a __getitem__ is iterable. By the way, collections.abc.Iterable also doesn't detect this case.)
|
|
msg130232 - (view) |
Author: Daniel Urban (durban) |
Date: 2011-03-07 07:21 |
I'm attaching an updated patch. Instead !PyIter_Check() this patch checks for tp_iter == NULL && !PySequence_Check. If this condition is false, PyObject_GetIter has a chance to succeed (and if it fails, we shouldn't mask the exception). I also added more tests which show why the previous patch was incorrect.
|
|
msg134821 - (view) |
Author: Terry J. Reedy (terry.reedy) *  |
Date: 2011-04-29 23:04 |
#11944 is probably a duplicate of this and should be checked when this is fixed
|
|
msg151110 - (view) |
Author: Martin Panter (vadmium) |
Date: 2012-01-12 04:51 |
I haven’t tried to understand what the patches do, but Issue 5218 looks like a very similar problem with a patch including a test case.
|
|
msg152580 - (view) |
Author: Terry J. Reedy (terry.reedy) *  |
Date: 2012-02-04 02:13 |
#13904 is another dup, with patches to test and ceval. I asked that they be reloaded to this issue.
|
|
msg152583 - (view) |
Author: Terry J. Reedy (terry.reedy) *  |
Date: 2012-02-04 02:28 |
#5218 is a 4th duplicate, also with a patch to the ceval loop and test.
|
|
msg152584 - (view) |
Author: Terry J. Reedy (terry.reedy) *  |
Date: 2012-02-04 02:31 |
Sorry Martin, I see you already said that. Anyway, I closed other three in favor of this one.
|
|
| Date |
User |
Action |
Args |
| 2012-02-04 02:31:16 | terry.reedy | set | messages:
+ msg152584 |
| 2012-02-04 02:28:38 | terry.reedy | set | nosy:
+ georg.brandl, pitrou, gpolo messages:
+ msg152583
|
| 2012-02-04 02:27:29 | terry.reedy | link | issue5218 superseder |
| 2012-02-04 02:21:20 | terry.reedy | set | nosy:
+ ron_adam
|
| 2012-02-04 02:13:16 | terry.reedy | set | nosy:
+ ncoghlan
messages:
+ msg152580 versions:
- Python 3.1 |
| 2012-02-04 02:12:56 | terry.reedy | link | issue13904 superseder |
| 2012-02-04 02:06:33 | terry.reedy | link | issue11944 superseder |
| 2012-01-12 04:51:33 | vadmium | set | messages:
+ msg151110 |
| 2012-01-12 04:40:48 | vadmium | set | nosy:
+ vadmium
|
| 2011-04-29 23:04:25 | terry.reedy | set | messages:
+ msg134821 |
| 2011-03-07 07:21:24 | durban | set | files:
+ issue4806.patch nosy:
terry.reedy, amaury.forgeotdarc, dangyogi, hagen, kcarnold, durban messages:
+ msg130232
|
| 2011-03-06 12:35:11 | durban | set | nosy:
terry.reedy, amaury.forgeotdarc, dangyogi, hagen, kcarnold, durban messages:
+ msg130168 versions:
+ Python 3.3 |
| 2011-03-06 09:47:11 | durban | set | nosy:
+ durban
|
| 2010-08-05 19:13:55 | hagen | set | files:
+ combined.patch
messages:
+ msg113022 |
| 2010-08-05 16:34:09 | terry.reedy | set | messages:
+ msg112998 |
| 2010-08-05 08:55:49 | hagen | set | messages:
+ msg112960 |
| 2010-08-04 21:08:09 | terry.reedy | set | nosy:
+ terry.reedy
messages:
+ msg112896 versions:
+ Python 3.2, - Python 2.6, Python 2.5, Python 3.0 |
| 2010-05-03 18:03:26 | belopolsky | set | keywords:
+ needs review stage: patch review |
| 2010-05-03 17:51:53 | dangyogi | set | nosy:
+ dangyogi
messages:
+ msg104861 versions:
+ Python 2.5 |
| 2009-12-29 16:41:47 | amaury.forgeotdarc | link | issue7548 superseder |
| 2009-06-03 11:46:39 | hagen | set | files:
- TypeError.patch |
| 2009-06-03 11:46:33 | hagen | set | files:
+ TypeError2.patch
messages:
+ msg88807 |
| 2009-06-03 11:10:15 | amaury.forgeotdarc | set | messages:
+ msg88803 |
| 2009-06-03 09:14:33 | hagen | set | files:
+ message_and_docs.patch |
| 2009-06-03 09:13:41 | hagen | set | files:
+ TypeError.patch keywords:
+ patch messages:
+ msg88800
versions:
+ Python 3.1, Python 2.7 |
| 2009-06-02 22:43:01 | kcarnold | set | nosy:
+ kcarnold messages:
+ msg88770
|
| 2009-01-03 13:44:56 | hagen | set | messages:
+ msg78957 |
| 2009-01-02 14:26:26 | amaury.forgeotdarc | set | nosy:
+ amaury.forgeotdarc messages:
+ msg78800 |
| 2009-01-02 12:46:02 | hagen | create | |